假设我定义了以下类:
Public Class BaseClass
...
End Class
Public Class DerivedClass
Inherits BaseClass
... Extra Fields, methods, etc ...
End Class
然后,在我的代码中,我有一个签名为的函数
Public Function DoSomething(...) As List(Of BaseClass)
当我尝试从中返回List(Of DerivedClass)
类型的对象时,我会得到错误:
Value of type 'System.Collections.Generic.List(Of BaseClass)' cannot be converted to 'System.Collections.Generic.List(Of DerivedClass)'
我知道不是DerivedClass
的所有额外字段都会被填充,但它会给我所需要的。
有没有办法做到这一点,或者这只是被认为是糟糕的编程实践?如果是这样的话,正确的方法是什么?
看看这个:
http://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx
了解协方差和反方差会让事情变得更清楚:)
- 协方差
使您能够使用比最初指定的更具体的类型。可以将IEnumerable的实例(Visual Basic中的IEnumeraable(of Derived))分配给IEnumerable类型的变量。
示例:
IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;
- 差异
使您能够使用比最初指定的更通用(派生较少)的类型。可以将IEnumerable的实例(Visual Basic中的IEnumerale(of Base))分配给IEnumeraable类型的变量。
示例:
Action<Base> b = (target) => { Console.WriteLine(target.GetType().Name); };
Action<Derived> d = b;
d(new Derived());
- 不变性
意味着您只能使用最初指定的类型;所以一个不变的泛型类型参数既不是协变的也不是反变的。不能将IEnumerable的实例(Visual Basic中的IEnumerale(of Base))分配给IEnumeraable类型的变量,反之亦然。