
将派生类列表转换为基类列表
协变是指派生类型可以替换其基类型而不会丢失任何功能。在本例中,我们有一个基类(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中文网其他相关文章!