假设我有界面和类:
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
为什么协方差在这种情况下不起作用?
答案 0 :(得分:25)
这是因为方差仅适用于引用类型(类,接口和委托)。添加一个类约束,它编译得很好:
public static void Do<T>() where T : class, ITree