C#基类作为参数类型
我有两个类,如下所示,类A继承自类BC#基类作为参数类型,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的
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
,您的代码将被编译。这是函数
假设存在吗?这是函数
假设存在吗?可能重复吗?非常感谢您的解释和提供替代方案。非常感谢您的解释和提供替代方案。