看书看得有点晕了,协变、逆变傻傻分不清楚。
泛型的逆变和协变:
如果某个返回类型可以由其基类替换,那么这个类型就是支持协变的。
如果某个参数类型可以由其派生类替换,那么这个类型就是支持逆变的。
参考:http://www.cnblogs.com/IPrograming/p/4471130.html
示例代码如下:
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;//编译报错,返回类型错误 } }
我现在也有点懵。
个人看书及查的资料所得,如有错误,欢迎指正。