投射列表<T> - 协方差/逆变问题

use*_*890 14 .net c# covariance contravariance .net-2.0

给出以下类型:

public interface IMyClass { }
public class MyClass : IMyClass { }
Run Code Online (Sandbox Code Playgroud)

我想知道如何将a转换List<MyClass>List<IMyClass>?关于协方差/逆变主题,我并不完全清楚,但据我所知,我不能因此而明白地列出名单.

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

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

你怎么能以更优雅/高效的方式解决它?

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

Jon*_*eet 21

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

List<IMyClass> converted = original.ConvertAll<IMyClass>(x => x);
Run Code Online (Sandbox Code Playgroud)

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

List<IMyClass> converted = original.ConvertAll<IMyClass>(
    delegate (MyClass x) { return x; });
Run Code Online (Sandbox Code Playgroud)

在.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();
Run Code Online (Sandbox Code Playgroud)

在.NET 4.0中,您可以ToList直接使用而无需中间转换,因为协方差IEnumerable<T>:

var converted = original.ToList<IMyClass>();
Run Code Online (Sandbox Code Playgroud)