C# 方法签名

C# 方法签名,c#,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 pos

例如:

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

有人能告诉我为什么这不可能?或者我能做些什么使之成为可能?

你不能,因为评论中提到了协方差问题。如果多斯这样做了呢:

public class A2 : A
{
}

public static void DoSth(List<A> a)
{
     a.Add(new A2()); // but a is a List<B>!!!
}

然后,您的代码就可以工作了,因为传入列表意味着您只能添加B或从B派生的类。

您不能,因为注释中提到了协方差问题。如果多斯这样做了呢:

public class A2 : A
{
}

public static void DoSth(List<A> a)
{
     a.Add(new A2()); // but a is a List<B>!!!
}

然后,您的代码就可以工作了,因为传入列表意味着您只能添加B或从B派生的类。

根据DanielHilgarth的评论,Doth期望的数据类型是强类型列表。通过向doth添加类型约束,可以实现所需的功能

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

根据DanielHilgarth的评论,DoSth期望的数据类型是强类型列表。通过向doth添加类型约束,可以实现所需的功能

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

列表与列表不同。您没有传递正确的数据类型。请记住,这里的数据类型是列表,而不是A或B,因此您的继承规则将不适用。@DanielHilgarth:Oops,我没有意识到这一点;pMake使用T实现了一个通用方法:约束完美非常感谢!我使用你的解决方案。首先,我将类型更改为Array,然后使用List.ToArray方法。但你们的解决方案很好,列表和列表是不同的。您没有传递正确的数据类型。请记住,这里的数据类型是列表,而不是A或B,因此您的继承规则将不适用。@DanielHilgarth:Oops,我没有意识到这一点;pMake使用T实现了一个通用方法:约束完美非常感谢!我使用你的解决方案。首先,我将类型更改为Array,然后使用List.ToArray方法。但是你的解决方案很好。你把几个a和B混淆了吗?它不应该是从A派生的t:A和或类吗?@Abbas-oops是的,我修复了类型约束。然而,我的第二句话是正确的——如果你传入一个列表,你只能添加Bs——你不能添加As。是的,但我认为你的意思是你不能将列表传递给doss方法。这仍然是可能的,对吗?@Abbas当然-然后所有的东西都被视为A。最初的例子是传递一个列表,这是我评论的基础。我的想法正是如此。你的评论现在对我来说是绝对正确和清楚的;你把几个a和B混在一起了吗?它不应该是从A派生的t:A和或类吗?@Abbas-oops是的,我修复了类型约束。然而,我的第二句话是正确的——如果你传入一个列表,你只能添加Bs——你不能添加As。是的,但我认为你的意思是你不能将列表传递给doss方法。这仍然是可能的,对吗?@Abbas当然-然后所有的东西都被视为A。最初的例子是传递一个列表,这是我评论的基础。我的想法正是如此。你的评论现在对我来说是绝对正确和清楚的;