如果.Net Framework 4中添加的Covariant类型参数使我能够进行看起来像多态的分配
为什么我可以写
IEnumerable<object> lst = new List<string>();
我不能写
List<object> lst = new List<string>();
答案 0 :(得分:4)
有两个原因导致它不起作用:
IEnumerable<T>
是协变的(声明为public interface IEnumerable<out T>
),但IList<T>
不是。否则你就能做到这样的事情:
IList<string> listOfStrings = ...
IList<object> listOfObjects = listOfStrings;
listOfObjects.Add(42); // would fail at runtime because it is actually a list of strings, not ints
协方差和逆变只适用于接口,而不适用于具体类
在.NET Framework版本4中,变体类型参数仅限于通用接口和通用委托类型。
答案 1 :(得分:2)
因为List {T}类型是invariant,所以在第二种情况下可以这样做:
List<object> lst = new List<string>();
lst.Add(10);
这是无效的,因为您要将Int32添加到字符串列表中。
IEnumerable {out T}类型是'out'暗示的协变。这意味着无法向其添加项目,只能从中获取项目,这使得第一个语句有效。
然而这是有效的:
List<object> lst = new List<object>();
lst.AddRange(new string[] { "hello" });