将派生类列表转换为基类列表
协变是指派生类型可以替换其基类型而不会丢失任何功能。在本例中,我们有一个基类(Animal)和一个派生类(Cat),其中基类包含一个虚拟方法 Play,它接受 List 作为输入参数。
以下代码演示了转换问题:
<code class="language-csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication9 { class Animal { public virtual void Play(List<Animal> animals) { } } class Cat : Animal { public override void Play(List<Animal> animals) { } } class Program { static void Main(string[] args) { Cat cat = new Cat(); cat.Play(new List<Cat>()); } } }</code>
编译代码将导致错误:Argument 1: cannot convert from 'System.Collections.Generic.List
出现此错误的原因是 List 是一个可写数据结构。如果我们允许从 List
为了解决此问题,C# 4 引入了一个名为“泛型协变”的概念,用于已知安全的接口。IEnumerable
通过将 Play 方法修改为接受 IEnumerable
<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<T>
接口代替 List<T>
,我们利用了 C# 的协变特性,避免了类型转换错误,同时保证了代码的安全性。 IEnumerable<T>
只允许读取数据,不允许修改,因此将 List<Cat>
转换为 IEnumerable<Animal>
是安全的。
以上是我可以在 C# 中将'List”转换为'List”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!