一尘不染

演员表 -协方差/相反方差问题

c#

给定以下类型:

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

我想知道如何将a转换List<MyClass>为a
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解决方案,但是出于完整性考虑,我也很高兴看到使用较新的框架版本的更优雅的解决方案。


阅读 329

收藏
2020-05-19

共1个答案

一尘不染

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

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

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

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

在.NET 3.5中,您可以使用LINQ CastOfType甚至可以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>();
2020-05-19