安全地将 C# 中的 List<派生类> 转换为 List<基类>
在 C# 中,处理继承和泛型类型时,您可能会遇到需要将派生类对象的列表转换为基类对象的列表的情况。如果基类包含在派生类中被重写的虚方法,这可能会导致问题。
考虑以下示例:
<code class="language-csharp">class Animal { public virtual void Play(List<Animal> animals) { } } class Cat : Animal { public override void Play(List<Animal> animals) { // Cat 特定的实现 } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); // 错误:参数 1 无法从“System.Collections.Generic.List<Cat>”转换为“System.Collections.Generic.List<Animal>” } }</code>
编译此代码时,您将遇到错误消息“参数 1:无法从 'System.Collections.Generic.List
为了解决这个问题,您需要了解泛型协变的概念。泛型协变允许您安全地扩展派生类重写中参数的类型。在本例中,您希望将参数类型从 List
C# 4 引入了对泛型协变的支持,借助于 IEnumerable
<code class="language-csharp">public virtual void Play(IEnumerable<Animal> animals) { }</code>
然后在 Cat 类中重写它:
<code class="language-csharp">public override void Play(IEnumerable<Animal> animals) { }</code>
您可以使 Play 方法协变安全。这允许您将 List
<code class="language-csharp">class Animal { public virtual void Play(IEnumerable<Animal> animals) { } } class Cat : Animal { public override void Play(IEnumerable<Animal> animals) { } } class Program { static void Main() { Cat cat = new Cat(); cat.Play(new List<Cat>()); } }</code>
此代码将成功编译并执行,不会出现错误,允许您在基类方法使用 IEnumerable<基类> 定义且派生类使用 IEnumerable<基类> 重写它时,安全地将 List<派生类> 转换为 List<基类>。
以上是如何在 C# 中安全地将'List”转换为'List”?的详细内容。更多信息请关注PHP中文网其他相关文章!