C# 当参数类型为基类时,将派生类传递给方法

C# 当参数类型为基类时,将派生类传递给方法,c#,inheritance,polymorphism,derived-class,C#,Inheritance,Polymorphism,Derived Class,似乎回答了我的问题,但我错了。看起来有一个非常简单的解释,但我一辈子都不知道为什么 这是典型的多态性继承问题… 我有一个基础班 public abstract class Client { public int Start; public int End; } 和两个继承类 public class Family : Client { } public class Helper : Client { } 我在此列表中插入了一些值 static List<Family&g

似乎回答了我的问题,但我错了。看起来有一个非常简单的解释,但我一辈子都不知道为什么

这是典型的多态性继承问题…
我有一个基础班

public abstract class Client
{
    public int Start;
    public int End;
}
和两个继承类

public class Family : Client { }
public class Helper : Client { }
我在此列表中插入了一些值

static List<Family> familySchedule = new List<Family>();
我犯了一个错误

参数1:无法从“System.Collections.Generic.List”转换为“System.Collections.Generic.List”

根据问题,这应该有效。 我能想到的唯一一种可能是,当它是传入的派生类时,多态性不支持在方法中使用基类的对象。当它是一个已传入的族时,在方法内部启动

如果这是正确的,难道没有办法创建一个可以处理不同类型的泛型方法吗?
(多态性不是为此而创建的吗?) 或者,唯一的解决方案是使用不同的参数创建相同的方法两次

如果我错过了一个非常明显的解决方案,请友好一点。。。我在这上面苦思冥想了这么久,我的大脑已经完全模糊了

编辑: 我的问题的一个更简洁的总结是:尽管有一种方法允许使用泛型参数,例如
static void sorter arlytolate(列表客户端列表),其中T:Client

这会阻止从方法内部访问对象属性。现在Family.Start将返回错误,Client.Start也将返回错误。我不太确定什么不会返回错误。 除非某个聪明人有答案,否则我认为目前唯一的解决方案是将所有参数解析到客户端。

您可以看到这一点

要绕过此问题,您有两个选项:

-在传递给方法之前,将您的列表转换为
客户机的列表

SortEarlyToLate(familySchedule.Cast<Client>().ToList());
SortEarlyToLate(familySchedule.Cast().ToList());
-初始化客户端列表并添加族对象

static List<Client> clientSchedule = new List<Client>();
clientSchedule.Add(new Family());
static List clientSchedule=new List();
clientSchedule.Add(新族());

List不是List的派生类想象一下,您将向传递到方法中的
family
列表中添加一个
Helper
对象(它的类型是
Client
right?)。是的,但实际上不是。它被视为一个
列表
,但对象仍然是一个
列表
,您显然无法向其中添加
Helper
类型的对象。
SortEarlyToLate(familySchedule.Cast<Client>().ToList());
static List<Client> clientSchedule = new List<Client>();
clientSchedule.Add(new Family());