0

我有如下两个类,A类继承自B类。

public class A
{
     public string Title { get; set; }
}

public class B: A
{

}

然后我有一个函数如下,它接收 A 类项目的列表:

public static void Get(List<A> values)
{
    // Do something
}

现在,当我尝试将 B 类的项目列表传递给函数时,如下所示,

private function void Test()
{
     var k = new List<B>();
     Get(k);
}

我收到以下错误消息

无法从 'System.Collections.Generic.List<B>' 转换为 'System.Collections.Generic.List<A>'

这不应该因为 B 只是从 A 继承并具有 A 所具有的属性而起作用吗?

我已经花了几个小时试图查找这个,但我还没有弄清楚我做错了什么。我该如何解决?

4

3 回答 3

5

不,不应该。它可能不安全:

class C : A {

}

public static void Get(List<A> values)
{
    values.Add(new C());
}

如果您要调用Getwith new List<B>(),那将是不安全的,因为您将插入Cin 的实例List<B>

但是,如果List<T>是“只读”接口,那将是安全的,在这种情况下,您正在寻找的covariance将是安全的。您可以List<A>改为IEnumerable<A>改为,它会工作。

于 2012-12-22T03:10:07.967 回答
1

虽然Bcan 可以在任何地方使用Acan ,List<B>andList<A>不是covariant。但是,从 .NET 4.0 开始,您可以使用Derived类列表代替IEnumerable<Base>. 因此,如果您声明您的函数采用IEnumerable<A>而不是List<A>,您的代码将编译。

于 2012-12-22T03:13:33.913 回答
0

B 确实从 A 继承,但这并不意味着List<B>Inherits from List<A> You 应该只将 B 对象放入 aList<A>并将其传递给方法。这就是多态性的全部意义所在。

  private function void Test()
  {
      var k = new List<A>();
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      k.Add(new B());
      Get(k);
  }
于 2012-12-22T03:09:24.840 回答