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

ienumerable - 协/逆变?元组> 对列表不满意

我无法理解为什么我不能用这个签名调用方法:

像那样:

我认为这与协/逆变有关,但这只是一个猜测。有人可以分享他的聪明吗?

0 投票
2 回答
1432 浏览

c# - C# 3.5 协方差问题?

我已经听到/阅读了很多关于 C# 中的协方差问题的内容,我想提出一些问题和场景,希望我能澄清我对此事的困惑。

在这些示例中,请假设始终定义以下内容:

我的第一个例子:

这应该有效,对吗?我在 C# 中对此进行了几次测试,它编译得很好并且运行良好(我对第一个示例的测试比这略多,因为我有将内容打印到控制台的多态调用)。

第二个例子:

在第二个示例中,我的理解是这不应该编译,并且是 .NET 4.0 中解决的协方差问题的根源。如果我错了,请纠正我。我也知道.NET 4.0 不允许具体类型之间的协变/逆变,只有接口。

最后,我想得到一些定义。我不太清楚这三个术语背后的含义:

  • 协方差
  • 逆变
  • 不变性(与不变性相同?)

至于最后一个词,我在 C++ 中经常使用它来指代隐含规则的更改。例如,如果我有一个整数并且它只允许有 1 到 10 之间的值,那么“不变性”就是它只能在 1 到 10 之间。我可能会误解这一点,我也不确定是否对于此特定讨论,此定义很好地转换为 C#。

编辑

我的目标是准确了解 C# 中泛型接口的协方差或转换问题。我发布的示例是我对问题所在的理解。如果所有示例都编译/运行良好,请提供一个示例,该示例确实重现了 C# 中最常见的协变/逆变/转换问题。我需要知道这一点,以便我可以识别并向其他人解释问题。

0 投票
6 回答
238 浏览

c# - C#中的铸造问题

我有一个继承自 IList 的接口:

我想将一个类型的变量IMyList转换为 type IList<Derived>or List<Derived>,以更容易或最有意义的为准。最好的方法是什么?

请注意,我使用的是 .NET 3.5

0 投票
2 回答
3225 浏览

java - 如何使用谓词函数过滤 Java 中的列表?

考虑以下代码:

它无法编译:

filter(Collection<T>, CollectionUtil.Predicate<T>)类型CollectionUtil中的方法不适用于参数(List<ICondition>, CollectionUtil.Predicate<Object>)

ICondition如果我定义了一个特定的谓词,一切都很好isNonNull(),但这很愚蠢,我不明白出了什么问题或如何解决它。

这是我的实用功能:

为什么我不能使用第二个谓词 with filter()

0 投票
1 回答
672 浏览

.net - .NET:协变和逆变

可能的重复:
协方差和反方差之间的差异

我试图了解什么是协变和逆变,以及两者之间的区别。我看过这个链接,到目前为止我已经理解了以下内容:

协方差是将派生成员分配给基成员的过程。如:

我什至不确定我在上面是否正确......猜猜。基本上,我正在寻找可以用最简单的术语为我简化它的人,以便我可以理解两者是什么以及它们之间的区别。

我也知道对此有类似的讨论主题,但大多数答案都不是我正在寻找的那种描述。

0 投票
2 回答
2340 浏览

c# - 支持单个类型参数的协变和逆变

可能重复:
同一类型参数的协变和逆变

out您可以使用关键字将泛型类型参数声明为协变:

in您可以使用关键字将泛型类型参数声明为逆变:

您还可以同时支持不同类型的参数:

那么为什么你不能同时支持一个类型参数呢?

0 投票
2 回答
1309 浏览

c# - 泛型协变和逆变

考虑代码片段。

但是如果我写ICollection<Object> obj2 = obj;它会给我一个编译时错误。

无法将类型“ System.Collections.Generic.IList<string>”隐式转换为“ System.Collections.Generic.ICollection<object>”。

为什么这种行为既然List<T>实现了IEnumerable<T>andICollection<T>并且也IList<T>被定义为

0 投票
2 回答
124 浏览

c# - 协变/逆变是否适用于不实现通用接口的隐式可转换类型?

我目前正在阅读 C# 中的协变和逆变。

所有示例都有可转换对象的详细信息,并且由于接口实现的准确性而有所不同,例如

在哪里Circle : IShape

协方差:SomeType<Circle> as SomeType<IShape>
逆变:SomeType<IShape> as SomeType<Circle>


如果每个人都有一个TypeA转换为另一种类型的书面文件,但没有实现任何通用接口,那么在处理这些类型的泛型转换时谈论协变/逆变是否仍然正确?或者这是一个不同的概念?TypeBimplicit converter

0 投票
2 回答
693 浏览

c# - c++/cli 中的委托方差

我正在将工作 C# 代码转换为 C++/CLI,但我无法理解为什么它不能编译。

我收到的错误:

void MyNamespace::Handler::DataChanged(System::Object ^,System::EventArgs ^)' : the specified function does not match the delegate type 'void (System::Object ^,System::Data::DataRowChangeEventArgs ^)'

0 投票
4 回答
3009 浏览

c# - C#中的协变/逆变

我有一本书解释了逆变/协方差,如下所示:

  • 委托可以具有比其方法目标更具体的参数类型。这称为逆变
  • 委托的返回类型可以比其目标方法的返回类型更具体。这称为协方差

而且,这是一个例子。

我认为为了使用协方差/逆变,需要使用new示例中所示的方法,但我似乎使用sa = ActionObjectand 得到了相同的结果o = RetrieveString。(我用 Mono 测试过)。

  • 那么,作者为什么用new协方差/逆变来解释呢?
  • 协方差/逆变思想背后的理论是什么?它只是一个花哨的名字描述object x = Everything inherit from object吗?这个奇怪的名字是从哪里来的?它的用途是什么?