问题标签 [contravariance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 为什么 C# 4.0 的协变/逆变仅限于参数化接口和委托类型?
这是 CLR 的限制还是与现有代码存在兼容性问题?
这与 C# 4.0 中委托组合的混乱变化有关吗?
编辑:是否有可能在 CLR 上运行不受限制的使用协变/逆变的语言?
c# - C# 4.0 中协变和逆变的良好真实用例示例?
在 C# 4.0 出来之前,我对协变和逆变非常兴奋。它迎合了我对理论正确性的喜爱!
然而,现在它已经发布了,我又开始编写普通的、日常的、无聊的代码,我开始怀疑:我曾经使用过它吗?我注意到我没有有意识地使用它。从那以后,我定义的所有接口或委托都没有从中受益。
只有一个案例我后来发现我无意中使用了协方差,但它非常微妙,我也可能没有注意到它。ImagineX
是一个基类并且Y
是它的后代:
有没有任何有趣或令人兴奋的例子,你们中的任何人在现实生活中使用协变或逆变,非人为的用例,并且通过惊人的“正确”真正拯救了一天?
events - 事件属性的逆变问题
假设我有一个简单的 EventArgs 子类:
考虑我有两个带事件的课程:
还有一个使用它们的简单程序:
多亏了逆变,MyMethod 既算作 EventHandler 又算作 EventHandler<MyArgs>。但是,如果我将 MyObject 的事件处理程序更改为将方法转发到 MyData 的属性:
事件属性无法将 EventHandler 转发给 EventHandler。这对我来说似乎很奇怪,因为它似乎属于逆变类别 - 具有较弱签名(基类)的处理程序应该能够接受具有更强签名(子类)的参数。
为什么 C# 不允许我这样做?有没有办法通过事件属性将通用 EventHandler 向下隧道传输到 EventHandler 中?是否可以对代表进行某种合法演员表?
c# - 为什么泛型接口默认不是协变/逆变的?
例如IEnumerable<T>
接口:
在此接口中,泛型类型仅用作接口方法的返回类型,而不用作方法参数的类型,因此它可以是协变的。鉴于此,编译器不能从理论上推断出接口的差异吗?如果可以,为什么 C# 要求我们显式设置协/逆变关键字。
更新:正如 Jon Skeet 所提到的,这个问题可以归结为子问题:
编译器可以通过它在当前泛型类型及其所有基本类型中的使用方式来推断泛型类型的协/逆变吗?
例如..NET Framework 4.0 中有多少通用接口参数可以自动标记为协/逆变而没有任何歧义?大约 70%、80%、90% 或 100%?
如果可以,默认情况下是否应该对泛型类型应用协/逆变?至少对于那些能够从类型使用中分析和推断协方差的类型。
scala - 内联时缺少编译/运行时错误
我在 Scala 中有以下类/特征
由于 Write trait 的逆变性,使用对象列表或数字列表调用方法是可行的。
当我使用整数列表调用 bar 时,我在 Scala 中收到编译错误。这是意料之中的;整数不是 Number 的超类型(而是子类型)
但是当我内联 Integer 列表的变量声明时,编译错误消失了,它甚至似乎工作。(我可以将元素添加到方法栏中的列表中)
编辑:以粗体回答 Rex Kerr
1)这怎么可能?选择第一个类型 Integer,内联 Number
2)为什么没有内联就不是这种情况?Scala 可以采用适当的类型
3) 为什么我不会得到运行时错误?因为列表是协变的
附言。我知道我可以在没有特征和包装的情况下获得逆变,并且有界限。
c#-4.0 - 为什么泛型类型参数的 .NET 4 差异不适用于类?
新的 .NET 4.0 通用类型参数的协变和逆变只适用于接口和委托。不支持课程的原因是什么?
java - Java泛型中如何使用逆变?
在 Java 中,协方差允许 API 设计者指定实例可以泛化为某种类型或该类型的任何子类型。例如:
逆变则相反。它允许我们指定一个实例可以泛化为某种类型或超类型。
Java 泛型的逆变性有何用处?你会选择什么时候使用它?
c# - C# 4.0 泛型和 ASP.net MVC
似乎在 C# 4.0 中,方差说明符仅适用于接口类型。
所以假设我有 ViewModel / EditModel 类和一个简单的模型层次结构。
我有一个局部视图,它接受任何类型的 MyEditModel(只要它是从 Base 派生的)和另一个只接受 Derived1 实例的视图。现在如何在同一页面上呈现两者?
接受任何 MyEditModel 的局部视图将在 Derived1 的编辑器和 Derived2 的编辑器之间共享。
c#-4.0 - LSP 的协方差和逆变
LSP与协方差和逆变之间有什么关系?有什么关系吗?LSP 是协方差的一种形式吗?