CLR 协变、逆变
程序员文章站
2022-03-26 23:09:21
看书看得有点晕了,协变、逆变傻傻分不清楚。 看到泛型和委托、委托方法,发现这里面的协变和逆变不一样。 泛型的逆变和协变:如果某个返回类型可以由其基类替换,那么这个类型就是支持协变的。如果某个参数类型可以由其派生类替换,那么这个类型就是支持逆变的。 参考:http://www.cnblogs.com/ ......
看书看得有点晕了,协变、逆变傻傻分不清楚。
看到泛型和委托、委托方法,发现这里面的协变和逆变不一样。
泛型的逆变和协变:
如果某个返回类型可以由其基类替换,那么这个类型就是支持协变的。
如果某个参数类型可以由其派生类替换,那么这个类型就是支持逆变的。
参考:
示例代码如下:
public class BaseClass { //... } public class DerivedClass : BaseClass { //... }
IEnumerable<DerivedClass> d = new List<DerivedClass>(); IEnumerable<BaseClass> b = d;
//IEnumerable<T> 接口的定义(支持协变) public interface IEnumerable<out T> : IEnumerable
委托方法的逆变和协变:
如果某个返回类型可以由其派生类替换,那么这个类型就是支持协变的。
如果某个参数类型可以由其基类替换,那么这个类型就是支持逆变的。
public delegate object TestDelegate(string str); class MyClass { public string t1(string s) { return ""; } public object t2(object s) { return ""; } public string t3(object s) { return ""; } public int t4(string s)//值类型不可以,只有引用类型支持协变和逆变 { return 0; } public void main() { TestDelegate td1 = t1; TestDelegate td2 = t2; TestDelegate td3 = t3; TestDelegate td4 = t4;//编译报错,返回类型错误 } }
我现在也有点懵。
个人看书及查的资料所得,如有错误,欢迎指正。
下一篇: extjs3 用户管理 页面