我正在尝试在C#4.0中执行以下操作:
我有一个基类和2个派生类
public class Base {}
public class DerivedClass1 : Base {}
public class DerivedClass2 : Base {}
我想做这样的事情,但它不起作用。
如何告诉通用列表接受基类和基类的派生类。
public class Class_1
{
public Class_1()
{
List<DerivedClass2> list = new List<DerivedClass2>();
new Class_2(list);
}
}
public class Class_2
{
public Class_2(List<Base> list)
{
}
}
在Java中我可以做这样的事情
public class Class_2
{
public Class_2(List<? extends Base> list)
{
}
}
C#
中是否存在类似的内容我希望我的问题很明确,只是关于列表的泛型。
非常感谢提前:)
答案 0 :(得分:3)
一般情况:
function Foo<T>(List<T> list) where T : Base {
...
}
加上接口和代理,C#允许共同/逆转。
例如IEnumerable<T>
和IList<T>
,您的代码将有效!请注意,如果List<T>
允许这样做,您可以使用公共基类将Derived1
插入Derived2
列表中,这会破坏类型安全性。所以简单地坚持上面的readonly接口。
答案 1 :(得分:2)
我认为你的意思是:
// Define other methods and classes here
public class Class_1
{
public Class_1()
{
List<DerivedClass2> list = new List<DerivedClass2>();
new Class_2<DerivedClass2>(list);
}
}
public class Class_2<T> where T : Base
{
public Class_2(List<T> list)
{
}
}
或者,如果您希望构造函数是通用的,而不是类:
// Define other methods and classes here
public class Class_1
{
public Class_1()
{
List<DerivedClass2> list = new List<DerivedClass2>();
Class_2.Create(list);
}
}
public class Class_2
{
public static Class_2 Create<T>(List<T> list) where T : Base
{
// Stuff
return new Class_2(/*Stuff*/);
}
public Class_2()
{
}
}