铸造名单,其中,T> - 协方差/逆变问题 [英] Casting List<T> - covariance/contravariance problem

查看:201
本文介绍了铸造名单,其中,T> - 协方差/逆变问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

由于以下几种类型:

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

我不知道我怎么可以转换名单,其中,MyClass的> 名单,其中,IMyClass> ?我不是协方差/逆变主题完全清楚,但我知道我不能只说​​白投,因为该列表。

I wonder how can I convert a List<MyClass> to a List<IMyClass>? I am not completely clear on the covariance/contravariance topics, but I understand that I cannot just plainly cast the List because of that.

我可以只用这个简单的解决方案上来;缺乏任何高雅,浪费资源:

I could come up with this trivial solution only; lacking any elegance, wasting resources:

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

你怎么能解决它在一个更优雅/性能方法?

How can you solve it in a more elegant/performant way?

请记住,我需要.NET 2.0的解决方案,但为了完整,我会很乐意使用新版本的框架看更优雅的解决方案了。的)

推荐答案

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

The simplest way is probably to use ConvertAll:

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

即使您正在使用.NET 2,您可以使用lambda语法,如果你正在使用VS2008或者更高。否则,总有匿名方法:

Even if you're using .NET 2, you can use lambda syntax if you're using VS2008 or higher. Otherwise, there's always anonymous methods:

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

在.NET 3.5中,你可以使用LINQ与铸造 OfType ,甚至只是选择

In .NET 3.5 you could use LINQ with Cast, OfType or even just 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&LT的协方差; T&GT;

In .NET 4.0 you can use ToList directly without an intermediate cast, due to the covariance of IEnumerable<T>:

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

这篇关于铸造名单,其中,T&GT; - 协方差/逆变问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆