假设我定义了以下类:
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
的所有额外字段都不会被填充,但它会给我我需要的东西。
有没有办法做到这一点,或者这只是被认为是糟糕的编程习惯?如果是这样,那么这样做的正确方法是什么?
答案 0 :(得分:2)
看看这个:
http://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx
理解协方差和反方差会稍微清楚一点:)
使您可以使用比最初指定的更具体的类型。 您可以将IEnumerable(IEnumerable(Of Derived)在Visual Basic中)的实例分配给IEnumerable类型的变量。
示例:强>
IEnumerable<Derived> d = new List<Derived>();
IEnumerable<Base> b = d;
使您可以使用比最初指定的更通用(更少派生)的类型。 您可以将IEnumerable(IEnumerable(Of Base)在Visual Basic中)的实例分配给IEnumerable类型的变量。
示例:强>
Action<Base> b = (target) => { Console.WriteLine(target.GetType().Name); };
Action<Derived> d = b;
d(new Derived());
表示您只能使用最初指定的类型;所以一个不变的泛型类型参数既不是协变的也不是逆变的。您不能将IEnumerable(IEnumerable(Of Base)在Visual Basic中)的实例分配给IEnumerable类型的变量,反之亦然。