从方法返回继承的类型

时间:2014-11-06 18:43:28

标签: vb.net visual-studio

假设我定义了以下类:

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的所有额外字段都不会被填充,但它会给我我需要的东西。

有没有办法做到这一点,或者这只是被认为是糟糕的编程习惯?如果是这样,那么这样做的正确方法是什么?

1 个答案:

答案 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类型的变量,反之亦然。