C#基类作为参数类型

C#基类作为参数类型,c#,C#,我有两个类,如下所示,类A继承自类B public class A { public string Title { get; set; } } public class B: A { } 然后,我有一个函数,如下所示,它接受一个类别a的项目列表: public static void Get(List<A> values) { // Do something } publicstaticvoidget(列表值) { //做点什么 } 现在,当我尝试将类B的

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

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

public class B: A
{

}
然后,我有一个函数,如下所示,它接受一个类别a的项目列表:

public static void Get(List<A> values)
{
    // Do something
}
publicstaticvoidget(列表值)
{
//做点什么
}
现在,当我尝试将类B的项列表传递到函数中时,如下所示

private function void Test()
{
     var k = new List<B>();
     Get(k);
}
私有函数无效测试()
{
var k=新列表();
Get(k);
}
我收到以下错误消息

无法从“System.Collections.Generic.List”转换为“System.Collections.Generic.List”

这不应该工作,因为B只是从A继承,并且将具有A所具有的属性吗


我已经花了几个小时试图查找这个问题,但我还没有弄清楚我做错了什么。如何修复它?

B确实继承自A,但这并不意味着
List
继承自
List
您应该将B对象放入
列表中
,并将其传递给方法。这就是多态性的意义所在

  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);
  }
私有函数无效测试()
{
var k=新列表();
k、 添加(新B());
k、 添加(新B());
k、 添加(新B());
k、 添加(新B());
k、 添加(新B());
k、 添加(新B());
Get(k);
}

B确实继承自A,但这并不意味着
List
继承自
List
您应该将B对象放入
列表中
,并将其传递给方法。这就是多态性的意义所在

  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);
  }
私有函数无效测试()
{
var k=新列表();
k、 添加(新B());
k、 添加(新B());
k、 添加(新B());
k、 添加(新B());
k、 添加(新B());
k、 添加(新B());
Get(k);
}

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

class C : A {

}

public static void Get(List<A> values)
{
    values.Add(new C());
}
C类:A类{
}
公共静态void Get(列表值)
{
添加(新的C());
}
如果使用
new List()
调用
Get
,这将是不安全的,因为您将在
List
中插入
C
的实例


然而,如果
List
是一个“只读”接口,那么在这种情况下,您正在寻找的协方差将是安全的。您可以将
List
改为
IEnumerable
,它会工作。

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

class C : A {

}

public static void Get(List<A> values)
{
    values.Add(new C());
}
C类:A类{
}
公共静态void Get(列表值)
{
添加(新的C());
}
如果使用
new List()
调用
Get
,这将是不安全的,因为您将在
List
中插入
C
的实例


然而,如果
List
是一个“只读”接口,那么在这种情况下,您正在寻找的协方差将是安全的。您可以将
List
改为
IEnumerable
,这样它就可以工作了。

虽然
B
可以在
A
的任何地方使用,但是
List
列表。但是,从.NET 4.0开始,您可以使用
派生类的列表来代替
IEnumerable
。因此,如果您将函数声明为采用
IEnumerable
而不是
List
,则代码将被编译。

尽管
B
可以在
A
的任何地方使用,但
List
List。但是,从.NET 4.0开始,您可以使用
派生类的列表来代替
IEnumerable
。因此,如果您将函数声明为采用
IEnumerable
而不是
List
,您的代码将被编译。

这是
函数
假设存在吗?这是
函数
假设存在吗?可能重复吗?非常感谢您的解释和提供替代方案。非常感谢您的解释和提供替代方案。