为什么协方差不适用于泛型方法



假设我有接口和类:

public interface ITree {}
public class Tree : ITree {}

由于IEnumerable<T>协变的,因此下面的代码行编译成功:

IEnumerable<ITree> trees = new List<Tree>();

但是当我把它放在通用方法中时:

public void Do<T>() where T : ITree
{
     IEnumerable<ITree> trees = new List<T>();
}

我从编译器收到编译错误:

错误 1 无法将类型"System.Collections.Generic.List"隐式转换为"System.Collections.Generic.IEnumerable"。存在显式转换(您是否缺少强制转换?D:\lab\Lab.General\Lab.General\Program.cs 83 40 Lab.General

为什么协方差在这种情况下不起作用?

这是因为方差仅适用于引用类型(类、接口和委托)。添加一个类约束,它可以很好地编译:

public static void Do<T>() where T : class, ITree

相关内容

  • 没有找到相关文章

最新更新