当参数类型为 base class 时将派生 class 传递给方法
Passing derived class to method when parameter type is base class
This 似乎回答了我的问题,但我遇到了错误。看起来有一个非常简单的解释,但我无法弄清楚为什么。
是classic多态性-继承问题...
我有一个基地 class
public abstract class Client
{
public int Start;
public int End;
}
和两个继承classes
public class Family : Client { }
public class Helper : Client { }
我在这个列表中插入了一些值
static List<Family> familySchedule = new List<Family>();
并创建一个接收客户端的方法
static void SortEarlyToLate(List<Client> clientList)
{
//some code doing stuff like changing Client.Start
}
现在,当我打电话给
SortEarlyToLate(familySchedule);
我收到错误
Argument 1: cannot convert from 'System.Collections.Generic.List<ConsoleApp11.Family>' to 'System.Collections.Generic.List<ConsoleApp11.Client>'
根据问题 referenced at the top of this question,这应该可行。
关于为什么它不起作用,我能想到的唯一可能性是多态性不支持在方法内部使用基 class 的对象,当它是派生的 class 传入时。即使用 Client.Start 当传入的是 Family 时,在方法内部。
如果那是正确的,难道没有办法创建可以处理不同类型的泛型方法吗?
(多态性不正是为此而创建的吗?)
或者是使用不同参数两次创建相同方法的唯一解决方案?
如果我错过了一个非常明显的解决方案,请多多关照...我已经为此苦思冥想了很长时间,我的大脑已经完全模糊了。
编辑:
我的问题的更简洁的总结是:虽然有一种方法允许通用参数,例如
static void SortEarlyToLate<T>(List<T> clientList) where T : Client
,
这阻止了从方法内部访问对象属性的能力。现在 Family.Start 会 return 出错,Client.Start 也会出错。我不太确定什么 不会 return 错误。
除非有聪明的人有答案,否则我认为目前唯一的解决方案是将所有参数解析给Client。
你可以看到这个C# Cannot convert from IEnumerable to IEnumerable
要绕过这个问题,您有 2 个选择:
-在传递给方法
之前将您的列表转换为Client
的列表
SortEarlyToLate(familySchedule.Cast<Client>().ToList());
-初始化您的客户列表并添加家庭对象。
static List<Client> clientSchedule = new List<Client>();
clientSchedule.Add(new Family());
This 似乎回答了我的问题,但我遇到了错误。看起来有一个非常简单的解释,但我无法弄清楚为什么。
是classic多态性-继承问题...
我有一个基地 class
public abstract class Client
{
public int Start;
public int End;
}
和两个继承classes
public class Family : Client { }
public class Helper : Client { }
我在这个列表中插入了一些值
static List<Family> familySchedule = new List<Family>();
并创建一个接收客户端的方法
static void SortEarlyToLate(List<Client> clientList)
{
//some code doing stuff like changing Client.Start
}
现在,当我打电话给
SortEarlyToLate(familySchedule);
我收到错误
Argument 1: cannot convert from 'System.Collections.Generic.List<ConsoleApp11.Family>' to 'System.Collections.Generic.List<ConsoleApp11.Client>'
根据问题 referenced at the top of this question,这应该可行。 关于为什么它不起作用,我能想到的唯一可能性是多态性不支持在方法内部使用基 class 的对象,当它是派生的 class 传入时。即使用 Client.Start 当传入的是 Family 时,在方法内部。
如果那是正确的,难道没有办法创建可以处理不同类型的泛型方法吗?
(多态性不正是为此而创建的吗?)
或者是使用不同参数两次创建相同方法的唯一解决方案?
如果我错过了一个非常明显的解决方案,请多多关照...我已经为此苦思冥想了很长时间,我的大脑已经完全模糊了。
编辑:
我的问题的更简洁的总结是:虽然有一种方法允许通用参数,例如
static void SortEarlyToLate<T>(List<T> clientList) where T : Client
,
这阻止了从方法内部访问对象属性的能力。现在 Family.Start 会 return 出错,Client.Start 也会出错。我不太确定什么 不会 return 错误。
除非有聪明的人有答案,否则我认为目前唯一的解决方案是将所有参数解析给Client。
你可以看到这个C# Cannot convert from IEnumerable to IEnumerable
要绕过这个问题,您有 2 个选择:
-在传递给方法
之前将您的列表转换为Client
的列表
SortEarlyToLate(familySchedule.Cast<Client>().ToList());
-初始化您的客户列表并添加家庭对象。
static List<Client> clientSchedule = new List<Client>();
clientSchedule.Add(new Family());