首页 > 后端开发 > C++ > 我可以在 C# 中将'List”转换为'List”吗?

我可以在 C# 中将'List”转换为'List”吗?

Patricia Arquette
发布: 2025-01-09 22:32:47
原创
294 人浏览过

Can I Cast a `List` to a `List` in C#?

将派生类列表转换为基类列表

协变是指派生类型可以替换其基类型而不会丢失任何功能。在本例中,我们有一个基类(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' to 'System.Collections.Generic.List'.

出现此错误的原因是 List 是一个可写数据结构。如果我们允许从 List 转换为 List,则可以将狗添加到猫列表中,这可能会导致意外行为。

为了解决此问题,C# 4 引入了一个名为“泛型协变”的概念,用于已知安全的接口。IEnumerable 就是这样一个接口。由于 IEnumerable 不允许变异,因此它被认为是协变安全的。

通过将 Play 方法修改为接受 IEnumerable 而不是 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<T> 接口代替 List<T>,我们利用了 C# 的协变特性,避免了类型转换错误,同时保证了代码的安全性。 IEnumerable<T> 只允许读取数据,不允许修改,因此将 List<Cat> 转换为 IEnumerable<Animal> 是安全的。

以上是我可以在 C# 中将'List”转换为'List”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板