从方法返回继承的类型



假设我定义了以下类:

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

最新更新