2

例如:

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.
}

有人可以告诉我为什么这是不可能的?或者我能做些什么来使它成为可能?

4

2 回答 2

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
{
}

然后你的代码就可以工作了,因为传入 aList<B>意味着你只能添加Bs (或派生自 s 的类B)。

于 2013-02-14T14:50:28.047 回答
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 { }    
}
于 2013-02-14T14:50:37.927 回答