方法签名

时间:2013-02-14 14:42:20

标签: c#

例如:

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

有人可以告诉我为什么这不可能?或者我能做些什么来实现它?

2 个答案:

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