【问题标题】:Does C# 4's covariance support nesting of generics?C# 4 的协方差是否支持泛型嵌套?
【发布时间】:2010-04-21 16:09:00
【问题描述】:

我不明白为什么下面的 '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 工作。)

【问题讨论】:

    标签: c# .net c#-4.0 covariance contravariance


    【解决方案1】:

    "z" 在 C# 4.0 中很好,IEnumerable&lt;T&gt; 是协变的。 List&lt;T&gt; 不是,你不能让 "y" 工作。

    直观地说,如果是,那么这将是有效的:

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

    这打破了“列表”只能包含 List&lt;int&gt; 元素的承诺。

    【讨论】:

    • 好吧,部分问题是“z”对我不起作用,因为我的目标仍然是 3.5。哎呀。感谢您对“y”不起作用的解释,这是有道理的。
    【解决方案2】:

    你在这里犯了几个错误。 首先,值类型不支持协变和逆变,因此无论您尝试对“int”做什么都行不通。

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

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

    我可以将字符串列表列表分配给对象的 IEnumerables 的 IEnumerable,这是协方差。 欲了解更多信息,请查看Covariance and Contravariance FAQ

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-29
      相关资源
      最近更新 更多