铸造名单,其中,T&GT; - 协方差/逆变问题 [英] Casting List<T> - covariance/contravariance problem
问题描述
由于以下几种类型:
public interface IMyClass { }
public class MyClass : IMyClass { }
我不知道我怎么可以转换名单,其中,MyClass的&GT;
到名单,其中,IMyClass&GT;
?我不是协方差/逆变主题完全清楚,但我知道我不能只说白投,因为该列表。
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屋!