gpt4 book ai didi

c# - 将类型的通用容器转换为继承类型的容器?

转载 作者:行者123 更新时间:2023-12-04 00:09:32 24 4
gpt4 key购买 nike

如果我有两个类:

public class A { }
public class B : A { }

我创建了一个通用容器和一个接受它的函数:
public void Foo(List<A> lst) { ... }

如果我尝试将 List<B> 转换为 List<A> ,我会得到一个无效的转换,而是必须像这样传递它:
var derivedList = new List<B>();
Foo(new List<A>(derivedList));

有没有办法将 List<B> 传递给这个函数,而无需分配全新列表的开销,或者 C# 是否不支持从派生类型的通用容器转换为其基本类型?

最佳答案

List<B> 根本就不是 List<A> - 毕竟,您可以将普通的 A 添加到 List<A> ,但不能添加到 List<B>

如果您使用的是 C# 4 和 .NET 4 并且您的 Foo 方法只需要遍历列表,则将方法更改为:

public void Foo(IEnumerable<A> lst) { ... }

在 .NET 4 中, IEnumerable<T> T 中是协变的,这允许从 IEnumerable<B> (包括 List<B> )到 IEnumerable<A> 的转换。这是安全的,因为值只会从 IEnumerable<A> 中“流出”。

要更详细地了解这一点,您可以观看我在 NDC 2010 上作为 torrent of NDC 2010 videos 的一部分进行的 session 视频。

关于c# - 将类型的通用容器转换为继承类型的容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7365240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com