例如:
public abstract class A
{}
public class B : A
{}
public class C
{
public static void DoSth(List<A> a)
{
}
}
Main
{
List<B> muchB = new List<B>;
C.DoSth(muchB); //Here Compiler tell me that List<B> isnt possible.
}
有人可以告诉我为什么这不可能?或者我能做些什么来实现它?
答案 0 :(得分:2)
你不能,因为评论中提到的协方差问题。如果DoSth
这样做会怎样:
public class A2 : A
{
}
public static void DoSth(List<A> a)
{
a.Add(new A2()); // but a is a List<B>!!!
}
一种选择是使DoSth
具有类型约束的通用:
public static void DoSth<T>(List<T> a) where T : A
{
}
然后您的代码就可以了,因为传入List<B>
意味着您只能添加B
s(或从B
派生的类)。
答案 1 :(得分:2)
根据DanielHilgarth的评论,DoSth预期的数据类型是一个强类型列表。通过向DoSth添加类型约束,您可以实现所需。
static void Main(string[] args)
{
List<B> muchB = new List<B>();
C.DoSth<B>(muchB);
}
public abstract class A {}
public class B : A {}
public class C
{
public static void DoSth<T>(List<T> a) where T : A { }
}