问题标签 [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.

0 投票
3 回答
5068 浏览

c# - 为什么 C# (4.0) 不允许泛型类类型中的协变和逆变?

这种限制的真正原因是什么?只是必须完成的工作吗?概念上很难吗?这是不可能的吗?

当然,不能在字段中使用类型参数,因为它们始终是可读写的。但这不可能是答案,不是吗?

这个问题的原因是我正在写一篇关于 C# 4 中的方差支持的文章,我觉得我应该解释一下为什么它仅限于委托和接口。只是为了颠倒举证责任。

更新: 埃里克问了一个例子。

这个怎么样(不知道这是否有意义,但是:-))

将它放在一个类中的原因可能是类本身中保存的缓存。并且请不要将您不同类型的宠物命名相同!

顺便说一句,这让我想到了 C# 5.0 中的可选类型参数 :-)

更新 2:我没有声称 CLR 和 C# 应该允许这样做。只是试图了解导致它没有的原因。

0 投票
3 回答
35881 浏览

java - 泛型:列表与列表相同?

我只是想了解extendsJava 泛型中的关键字。

List<? extends Animal>意味着我们可以将任何对象塞入Listwhich IS A Animal

那么以下内容是否也意味着同样的事情:

有人可以帮我知道上述两者之间的区别吗?对我来说extends,这里听起来是多余的。

谢谢!

0 投票
2 回答
814 浏览

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

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

新的协方差特性是否根本不适用于泛型的泛型,或者我做错了什么?(我想避免使用 .Cast<> 来使 y 和 z 工作。)

0 投票
1 回答
136 浏览

c# - 不能用接口实现逆变吗?

我正处于开始掌握逆变的地步,尽管我正在尝试找出可以使用接口代替的优势是什么。显然我错过了一些东西。

这是 c#4 示例

在 c# 的早期版本中工作的相同示例

这些可能不是最好的例子,但我似乎仍然无法“明白”。动作委托上定义的 in 键是否只是一种简写的语法方式,比如 lambda 是委托的?

0 投票
2 回答
25027 浏览

c# - 了解 C# 中的协变和逆变接口

我在我正在阅读的 C# 教科书中遇到了这些,但我很难理解它们,可能是由于缺乏上下文。

对它们是什么以及它们有什么用处有一个很好的简明解释吗?

编辑澄清:

协变接口:

逆变接口:

0 投票
2 回答
726 浏览

c# - C# 4.0 中的协方差和逆变推理

当我们在 C# 4.0 中定义接口时,我们可以将每个泛型参数标记为inout。如果我们尝试将泛型参数设置为 out 并且会导致问题,编译器会引发错误,不允许我们这样做。

问题:

如果编译器有办法推断covariance( out) 和contravariance( in) 的有效用途,为什么我们必须这样标记接口?让我们像往常一样定义接口,当我们尝试在客户端代码中使用它们时,如果我们尝试以不安全的方式使用它们会引发错误,这还不够吗?

例子:

还,

这不是Java在相同情况下所做的吗?据我记得,你只是做类似的事情

还是我在混合东西?

谢谢

0 投票
2 回答
2318 浏览

.net - .NET 4.0 通用不变量、协变、逆变

这是我面临的情况:

现在,当我尝试将 UserDataAccessLayer 转换为它的通用基类型ITableDataAccessLayer<TableRecord>时,编译器抱怨它不能隐式转换类型。

当我尝试在泛型参数的接口声明中使用inorout关键字时,编译器会抱怨Invalid variance: The type parameter must be invariantly valid。

我有以下抽象类:

示例具体实现如下:

返回新的用户数据访问层();是编译器抱怨的地方。

0 投票
1 回答
790 浏览

c#-4.0 - 我可以有一个既是协变又是逆变的类型,即与子类型和超类型完全可替代/可更改的类型?

我可以有一个可以协变和逆变的类型(现在忘记它的语义)吗?

例如:

转至 Eric Lippert 的博客,了解 C# 4.0 中的差异,因为几乎没有其他任何地方涵盖了该主题的充分基础。


无论如何我都试过了,它不仅不允许这样做,而且告诉我我错过了整点。我需要了解只读、只写和方差之间的联系。

我想我还有一些阅读要做。

但与此同时,任何简短的、顿悟的答案都是受欢迎的。

0 投票
3 回答
1487 浏览

c# - 在 C# 中,事件处理程序参数是逆变的吗?

如果我有一个通过(例如)FrobbingEventArgs 引发事件的类,我是否可以使用采用 EventArgs 的方法来处理它?

这是一些代码:

我问的原因是 ReSharper 似乎对 XAML 中的等效项有问题(看起来像),我想知道这是 ReSharper 中的错误,还是我对 C# 的理解有误。

0 投票
1 回答
137 浏览

.net - 检测接口泛型类型参数的差异

有没有办法反映接口以检测其泛型类型参数和返回类型的差异?换句话说,我可以使用反射来区分这两个接口:

两者的 IL 看起来相同。