gpt4 book ai didi

.net-4.0 - C# 4.0 中的泛型变体

转载 作者:行者123 更新时间:2023-12-03 14:33:03 29 4
gpt4 key购买 nike

C# 4.0 中的 Generic Variance 的实现方式使得可以毫无异常(exception)地编写以下内容(这在 C# 3.0 中会发生):

 List<int> intList = new List<int>();
List<object> objectList = intList;

[非功能示例:参见 Jon Skeet 的回答]

我最近参加了一个 session ,其中 Jon Skeet 对通用方差进行了出色的概述,但我不确定我是否完全理解它 - 我理解 inout 关键字在反方差和协方差方面的重要性,但我很好奇幕后发生了什么。

执行此代码时,CLR 看到了什么? 是隐式地将 List<int> 转换为 List<object> 还是简单地内置于我们现在可以在派生类型与父类型之间转换?

出于兴趣,为什么在以前的版本中没有引入它,主要好处是什么 - 即现实世界的使用?

有关此 post for Generic Variance 的更多信息(但问题非常过时,正在寻找真实的最新信息)

最佳答案

不,您的示例不起作用,原因有以下三个:

  • 类(例如 List<T> )是不变的;只有委托(delegate)和接口(interface)是变体
  • 为了使方差起作用,接口(interface)只能在一个方向上使用类型参数(in 表示逆变,out 表示协方差)
  • 不支持将值类型作为变量的类型参数 - 因此没有来自 IEnumerable<int> 的转换至IEnumerable<object>例如

  • (代码在 C# 3.0 和 4.0 中都无法编译 - 也不异常(exception)。)

    所以这会起作用:
    IEnumerable<string> strings = new List<string>();
    IEnumerable<object> objects = strings;

    CLR 只使用未更改的引用 - 没有创建新对象。所以如果你调用 objects.GetType()你仍然会得到 List<string> .

    我相信它没有更早地引入,因为语言设计者仍然必须制定如何公开它的细节——它从 v2.1 开始就在 CLR 中。

    好处与您希望能够将一种类型用作另一种类型的其他时间相同。使用我上周六使用的同一个例子,如果你有东西实现 IComparer<Shape>按区域比较形状,你不能用它来对 List<Circle> 进行排序真是太疯狂了。 - 如果它可以比较任意两个形状,它当然可以比较任意两个圆。从 C# 4 开始,将会有来自 IComparer<Shape> 的逆变转换。至 IComparer<Circle>所以你可以调用 circles.Sort(areaComparer) .

    关于.net-4.0 - C# 4.0 中的泛型变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208043/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com