代码之家  ›  专栏  ›  技术社区  ›  Homam

为什么协变类型参数不允许我写入[List<object>lst=new List<string>()]?

  •  3
  • Homam  · 技术社区  · 15 年前

    Covariant 在.NETFramework4中添加的类型参数使我能够进行类似多态性的赋值

    为什么我会写作

    IEnumerable<object> lst = new List<string>();
    

    我不会写字

    List<object> lst = new List<string>();
    
    2 回复  |  直到 15 年前
        1
  •  4
  •   Thomas Levesque    15 年前

    它不起作用的原因有两个:

    • 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
      

    From MSDN

    在.NETFramework版本4中,变量类型参数仅限于泛型接口和泛型委托类型。

        2
  •  2
  •   eulerfx    15 年前

    因为列表{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" });