gpt4 book ai didi

c# - Casting List - 协方差/逆变问题

转载 作者:可可西里 更新时间:2023-11-01 07:54:12 24 4
gpt4 key购买 nike

给定以下类型:

public interface IMyClass { }
public class MyClass : IMyClass { }

我想知道如何转换 List<MyClass>List<IMyClass> ?我对协变/逆变主题不是很清楚,但我知道我不能因此而简单地使用 List。

我只能想出这个微不足道的解决方案;缺乏优雅,浪费资源:

...
public List<IMyClass> ConvertItems(List<MyClass> input)
{
var result = new List<IMyClass>(input.Count);
foreach (var item in input)
{
result.Add(item);
}
return result;
}
....

如何以更优雅/更高效的方式解决它?

(请注意,我需要 .NET 2.0 解决方案,但为了完整起见,我也很乐意看到使用更新框架版本的更优雅的解决方案。)

最佳答案

最简单的方法可能是使用 ConvertAll :

List<IMyClass> converted = original.ConvertAll<IMyClass>(x => x);

即使您使用的是 .NET 2,如果您使用的是 VS2008 或更高版本,也可以使用 lambda 语法。否则,总是有匿名方法:

List<IMyClass> converted = original.ConvertAll<IMyClass>(
delegate (MyClass x) { return x; });

在 .NET 3.5 中,您可以将 LINQ 与 Cast 结合使用, OfType甚至只是 Select :

var converted = original.Cast<IMyClass>().ToList();
var converted = original.OfType<IMyClass>().ToList();
var converted = original.Select(x => (IMyClass) x).ToList();

在 .NET 4.0 中,您可以使用 ToList由于 IEnumerable<T> 的协方差,直接没有中间转换:

var converted = original.ToList<IMyClass>();

关于c# - Casting List<T> - 协方差/逆变问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4931789/

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