问题标签 [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 投票
4 回答
3785 浏览

c# - ref and out parameters in C# and cannot be marked as variant

What does the statement mean?

From here

ref and out parameters in C# and cannot be marked as variant.

1) Does it mean that the following can not be done.

2) Or does it mean I cannot have the following.

I tried (2) and it worked.

0 投票
3 回答
265 浏览

c# - 为什么我不能从列表转换列出即使IScreen实现了IRenderable?

非常不言自明的问题,很高兴得到任何答案。对我来说这没有意义。我不在乎丢失信息。我只想以某种方式将所有继承 IRenderable 的列表连接到一个列表中,然后在其上调用 IRenderable 方法。我有一种感觉,这是我忘记的一些基本编程规则......

编辑:这是代码:

edit2:顺便说一句,我安装了 .net 4.0,但参考仍然是 System.dll 版本 2.0.5.0

0 投票
1 回答
734 浏览

c# - 有没有办法在 C# 4.0 中确定接口/委托的方差?

所以现在我们在 C# 中的接口和委托上有了通用协变和逆变,我只是好奇如果给定一个Type,你可以找出它的通用参数的协变/逆变。我开始尝试编写自己的实现,它会查看给定类型的所有方法,并查看返回类型和/或参数是否与泛型参数中的类型匹配。问题是,即使我有这个:

使用我的逻辑,它看起来应该是逆变的,但由于我们实际上没有指定:

(in 参数)它实际上不是逆变的。这引出了我的问题:有没有办法确定泛型参数的方差?

0 投票
1 回答
267 浏览

.net - 为什么 .NET 4 中的类不是协变的?

可能重复:
为什么 C# 4.0 中的类没有通用差异?

作为一名新手程序员,我有几个关于 .NET 4 的变化的问题。与其说是它是如何工作的,不如说是为什么某些东西没有变化,以及其他人是否会觉得这很有用。

问题一:

我知道接口和委托在 .NET 4 中可以是协变/逆变的,但为什么不是类呢?所以,问题1:

这在某种程度上不安全吗?这不会有用吗?


问题2:

问题 2 源自问题 1,但可能更多地处理签名而不是方差。假设我有一个带有 MustOverride 成员的 MustInherit 类:

在派生类中,为什么不能重写 SomeClass 并返回一个 Derived Class Of BaseClass?这不安全吗?仅仅是签名不检查继承关系吗?

任何关于为什么在 .NET 4 中不允许这样做的见解将不胜感激。

0 投票
2 回答
222 浏览

c# - 逆变委托值类型

谁能阐明为什么逆变不适用于 C# 值类型?

以下不起作用

0 投票
2 回答
801 浏览

covariance - could someone explain the connection between type covariance/contravariance and category theory?

I am just starting to read about category theory, and would very much appreciate it if someone could explain the connection between CS contravariance/covariance and category theory. What would some example categories be (i.e. what are their objects/morphisms?)? Thanks in advance?

0 投票
1 回答
2955 浏览

c# - IEnumerable 是如何实现的反变体?

这篇文章(http://blogs.msdn.com/b/brada/archive/2005/01/18/355755.aspx)说IEnumerable<T>是反变体。然而类型 T 是协变的,因为它是一个out参数。那么在什么情况下是IEnumerable<T>反变体?

希望我没有混淆!感谢您提前回答!

0 投票
2 回答
728 浏览

.net - 反方差和协方差 - 通过 C# 的 CLR

在 CLR via c# 第三版中,有一个我似乎无法理解的示例:

不变意味着不能更改该泛型类型参数。到目前为止,我在本章中只展示了不变的泛型类型参数。n

逆变意味着泛型类型参数可以从一个类更改为从它派生的类。在 C# 中,您使用in 关键字指示逆变泛型类型参数。

逆变泛型类型参数只能出现在输入位置,例如方法的参数。n 协变意味着泛型类型参数可以从一个类更改为其基类之一。在 C# 中,您使用out 关键字指示协变泛型类型参数。协变泛型类型参数只能出现在输出位置,例如方法的返回类型。

然后作者继续举这个例子:

这里,泛型类型参数 T 用 in 关键字标记,使其具有逆变性;并且泛型类型参数 TResult 用 out 关键字标记,使其成为协变的

这是我在下一页(292)上遇到问题的地方,然后他在使用界面时说相反。

当使用接受泛型参数和返回值的委托时,建议始终为逆变和协变指定 in 和 out 关键字,因为这样做不会产生不良影响,并使您的委托可以在更多场景中使用。与委托一样,具有泛型类型参数的接口可以使其类型参数是逆变的或协变的。下面是一个带有逆变 >generic 类型参数的接口示例:

由于 T 是逆变的,因此可以使以下代码编译并成功运行:

在第二个示例中,他使用了 out 关键字 ( IEnumerator<out T>),然后将其称为逆变。这是正确的还是我错过了什么。在接口中定义逆变和协变是否有区别?关于这本书,我去过 Oreilly 的网站,但没有列出。

0 投票
1 回答
81 浏览

c# - 逆变器不起作用

到目前为止一切都很好,但是为什么这会产生空值?

myControl 现在为空...

0 投票
2 回答
378 浏览

scala - Scala:使用函数作为第一类对象的问题

我需要一个通用函数的集合,但我无法以我喜欢的方式完成它。我创建了一个

但是一旦我尝试插入一个函数,例如

我得到一个错误。我如何声明一个不考虑参数和返回值类型的通用函数集合?