在 C# 中将派生类列表转换为基类列表
此示例演示了一个常见问题:将派生类对象列表(例如 List<Cat>
)传递给需要基类对象列表(List<Animal>
)的方法。 不允许直接赋值,因为基类引用不能直接指向派生类对象。
问题:
尝试将 List<Cat>
传递给带有 List<Animal>
参数的方法会导致编译器错误。
解决方案:使用 IEnumerable
和协方差
该解决方案利用了 C# 的通用协方差。 不要使用 List<Animal>
,而是将方法参数类型更改为 IEnumerable<Animal>
。 IEnumerable
是只读接口;这可以防止该方法修改原始集合,从而解决潜在的类型安全问题。
修改后的代码:
<code class="language-csharp">class Animal { public virtual void Play(IEnumerable<Animal> animals) { } } class Cat : Animal { public override void Play(IEnumerable<Animal> animals) { //Implementation } } class Program { static void Main() { Cat myCat = new Cat(); myCat.Play(new List<Cat>()); // This now compiles successfully } }</code>
这是有效的,因为 List<Cat>
隐式转换为 IEnumerable<Cat>
,并且 IEnumerable<Cat>
与 IEnumerable<Animal>
协变。 Play
方法现在可以安全地迭代集合,而无需尝试修改它。 这种方法保持类型安全,同时允许灵活的方法参数化。
以上是如何在 C# 中将列表转换为列表?的详细内容。更多信息请关注PHP中文网其他相关文章!