c# - 当参数类型是基类时将派生类传递给方法
问题描述
这似乎回答了我的问题,但我遇到了一个错误。看起来有一个非常简单的解释,但我一生都无法弄清楚为什么。
这是经典的多态继承问题......
我有一个基类
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>();
并创建一个接收客户端的方法
static void SortEarlyToLate(List<Client> clientList)
{
//some code doing stuff like changing Client.Start
}
现在,当我打电话时
SortEarlyToLate(familySchedule);
我收到错误
参数 1:无法从 'System.Collections.Generic.List<ConsoleApp11.Family>' 转换为 'System.Collections.Generic.List<ConsoleApp11.Client>'
根据此问题顶部引用的问题,这应该可行。我能想到它为什么不起作用的唯一可能性是,当它是传入的派生类时,多态性不支持在方法内部使用基类的对象。即在方法内部使用 Client.Start被传递进来的家庭。
如果这是正确的,是否有办法创建一个可以处理不同类型的通用方法?
(不正是为此创建了多态性吗?)还是唯一的解决方案是使用不同的参数两次创建相同的方法?
如果我错过了一个非常明显的解决方案,请保持友好......我已经为此绞尽脑汁很久了,我的大脑已经完全糊涂了。
编辑:我的问题的一个更简洁的总结是:虽然有一种方法可以允许泛型参数,例如
static void SortEarlyToLate<T>(List<T> clientList) where T : Client
,
这会阻止从方法内部访问对象属性的能力。现在 Family.Start 将返回错误,Client.Start 也将返回错误。我不太确定什么不会返回错误。除非某个聪明人有答案,否则我认为目前唯一的解决方案是将所有参数解析给客户端。
解决方案
你可以看到这个C# Cannot convert from IEnumerable to IEnumerable
要绕过这个问题,你有 2 个 choix :
- 将您的列表作为Client
传递给方法之前的列表
SortEarlyToLate(familySchedule.Cast<Client>().ToList());
-初始化您的客户列表并添加家庭对象。
static List<Client> clientSchedule = new List<Client>();
clientSchedule.Add(new Family());
推荐阅读
- javascript - BotUI: Timestamps in speech bubbles
- powershell - I try to run angular 'ng serve' absolutely new project and I get a lot of errors. A project run only from C:\Windows\System32
- azure - System.IO.FileSystem.AccessControl assembly not found in .NET Core 3.0
- html - Is there a way so that my list-item can take the complete height taken by my ul?(Without hardcoding)
- c# - 如何从 Xamarin 中的 iOS DropInteraction 读取 pdfdoc
- javascript - 我正在通过laravel中的AJAX上传图片,已成功上传,但Successful fucntion不起作用
- java - 如何在 Java 中接受任意数量的参数作为 Int,例如添加数字?
- c# - 安装重建的 C# 项目后未处理的异常
- angular - Angular HTTP 中的 lastValueFrom 和 firstValueFrom 是等价的吗?
- amazon-web-services - 如何使用 AWS CLI 启动 RDS 数据库实例?