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

C 4的协方差是否支持泛型嵌套?

  •  5
  • scobi  · 技术社区  · 14 年前

    我不明白为什么下面的“x”会转换,但是“y”和“z”不会。

    var list = new List<List<int>>();
    
    IEnumerable<List<int>> x = list;
    List<IEnumerable<int>> y = list;
    IEnumerable<IEnumerable<int>> z = list;
    

    新的协方差特性对泛型不起作用吗?还是我做错了什么?(我想避免使用.cast使y和z工作。)

    2 回复  |  直到 14 年前
        1
  •  7
  •   Hans Passant    14 年前

    “Z”在C 4.0中很好, IEnumerable<T> 是协变的。 List<T> 但是不是,你不能让“y”工作。

    直觉上,如果是这样的话,这是有效的:

    List<IEnumerable<int>> y = list
    y.Add(new Stack<int>());
    

    这违背了“列表”只能包含 List<int> 元素。

        2
  •  1
  •   Alexandra Rusina    14 年前

    你在这里犯了几个错误。 首先,协方差和反方差不支持值类型,所以无论您尝试使用“int”做什么都不起作用。

    其次,检查嵌套泛型类型中的差异的有效示例更像这样:

    var list = new List<List<String>>();
    IEnumerable<IEnumerable<object>> z = list; 
    

    我可以将字符串列表分配给对象的IEnumerable的IEnumerable,这是协方差。 有关详细信息,请查看 Covariance and Contravariance FAQ .