1
20
不,您的示例不起作用的原因有三个:
(代码无法在C 3.0和4.0中编译-没有例外。) 所以这个 将 工作:
clr只使用引用,未更改-不创建新对象。所以如果你打电话来
我相信它之前没有被引入,因为语言设计者仍然需要解决如何公开它的细节——它从V2开始就在CLR中。
这些好处与其他时候相同,在这些时候您希望能够使用一种类型作为另一种类型。用上周六我用过的同样的例子,如果你有工具的话
|
2
15
一些额外的想法。
正如Jon和其他人正确地指出的,我们在类上并没有做变化,只有接口和委托。所以在您的示例中,clr什么也看不到;代码无法编译。如果您通过插入足够的强制转换来编译它,那么它会在运行时崩溃,并出现错误的转换异常。 现在,当差异发挥作用时,在幕后如何工作仍然是一个合理的问题。答案是:我们将其限制为参数化接口和委托类型的引用类型参数的原因是 没有什么 发生在幕后。当你说
在幕后发生的是,对字符串的引用被固定在类型为object的变量中 无需修改 . 构成对字符串引用的位是合法的对对象引用的位,因此这里不需要发生任何事情。clr只是停止将这些位看作是一个字符串,并开始将它们看作是一个对象。 当你说:
同样的事情。什么都没发生。引用字符串枚举器的位与引用对象枚举器的位相同。当你做演员的时候,会有更多的魔法在起作用,比如:
现在,clr必须生成一个检查,确保e1确实实现了该接口,并且该检查必须能够智能地识别差异。 但是我们可以摆脱变量接口的原因是没有OP转换 因为 常规分配兼容性就是这样。你打算用e2做什么?
返回引用字符串的位。我们已经确定,这些与对象是兼容的,没有变化。 为什么不早点介绍?我们还有其他功能要做,而且预算有限。 原则上的好处是什么?从字符串序列转换为对象序列“只是工作”。 |
3
8
.NET的第一个版本(1.x)根本没有泛型,所以泛型差异还远远没有。 应该注意,在.NET的所有版本中,都存在数组协方差。不幸的是,这是不安全的协方差:
C 4中的协方差和逆方差是安全的,可以防止这个问题。
在代码中,您多次调用API,希望使用放大的基类型(例如
在C 2和C 3中,您需要手动转换为
P.S.真是糟透了,斯基特的回答是把我所有的重复点都吃了。该死的,双向飞碟!:-)看起来他 answered this before 但是。 |
Aaron · 我如何实现一个方法来接受在T中是逆变的消费者? 7 年前 |