问题标签 [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.
ienumerable - 协/逆变?元组> 对列表不满意
我无法理解为什么我不能用这个签名调用方法:
像那样:
我认为这与协/逆变有关,但这只是一个猜测。有人可以分享他的聪明吗?
c# - C# 3.5 协方差问题?
我已经听到/阅读了很多关于 C# 中的协方差问题的内容,我想提出一些问题和场景,希望我能澄清我对此事的困惑。
在这些示例中,请假设始终定义以下内容:
我的第一个例子:
这应该有效,对吗?我在 C# 中对此进行了几次测试,它编译得很好并且运行良好(我对第一个示例的测试比这略多,因为我有将内容打印到控制台的多态调用)。
第二个例子:
在第二个示例中,我的理解是这不应该编译,并且是 .NET 4.0 中解决的协方差问题的根源。如果我错了,请纠正我。我也知道.NET 4.0 不允许具体类型之间的协变/逆变,只有接口。
最后,我想得到一些定义。我不太清楚这三个术语背后的含义:
- 协方差
- 逆变
- 不变性(与不变性相同?)
至于最后一个词,我在 C++ 中经常使用它来指代隐含规则的更改。例如,如果我有一个整数并且它只允许有 1 到 10 之间的值,那么“不变性”就是它只能在 1 到 10 之间。我可能会误解这一点,我也不确定是否对于此特定讨论,此定义很好地转换为 C#。
编辑
我的目标是准确了解 C# 中泛型接口的协方差或转换问题。我发布的示例是我对问题所在的理解。如果所有示例都编译/运行良好,请提供一个示例,该示例确实重现了 C# 中最常见的协变/逆变/转换问题。我需要知道这一点,以便我可以识别并向其他人解释问题。
c# - C#中的铸造问题
我有一个继承自 IList 的接口:
我想将一个类型的变量IMyList
转换为 type IList<Derived>
or List<Derived>
,以更容易或最有意义的为准。最好的方法是什么?
请注意,我使用的是 .NET 3.5
java - 如何使用谓词函数过滤 Java 中的列表?
考虑以下代码:
它无法编译:
“
filter(Collection<T>, CollectionUtil.Predicate<T>)
类型CollectionUtil
中的方法不适用于参数(List<ICondition>, CollectionUtil.Predicate<Object>)
”
ICondition
如果我定义了一个特定的谓词,一切都很好isNonNull()
,但这很愚蠢,我不明白出了什么问题或如何解决它。
这是我的实用功能:
为什么我不能使用第二个谓词 with filter()
?
.net - .NET:协变和逆变
可能的重复:
协方差和反方差之间的差异
我试图了解什么是协变和逆变,以及两者之间的区别。我看过这个链接,到目前为止我已经理解了以下内容:
协方差是将派生成员分配给基成员的过程。如:
我什至不确定我在上面是否正确......猜猜。基本上,我正在寻找可以用最简单的术语为我简化它的人,以便我可以理解两者是什么以及它们之间的区别。
我也知道对此有类似的讨论主题,但大多数答案都不是我正在寻找的那种描述。
c# - 支持单个类型参数的协变和逆变
可能重复:
同一类型参数的协变和逆变
out
您可以使用关键字将泛型类型参数声明为协变:
in
您可以使用关键字将泛型类型参数声明为逆变:
您还可以同时支持不同类型的参数:
那么为什么你不能同时支持一个类型参数呢?
c# - 泛型协变和逆变
考虑代码片段。
但是如果我写ICollection<Object> obj2 = obj;
它会给我一个编译时错误。
无法将类型“
System.Collections.Generic.IList<string>
”隐式转换为“System.Collections.Generic.ICollection<object>
”。
为什么这种行为既然List<T>
实现了IEnumerable<T>
andICollection<T>
并且也IList<T>
被定义为
c# - 协变/逆变是否适用于不实现通用接口的隐式可转换类型?
我目前正在阅读 C# 中的协变和逆变。
所有示例都有可转换对象的详细信息,并且由于接口实现的准确性而有所不同,例如
在哪里Circle : IShape
协方差:SomeType<Circle> as SomeType<IShape>
逆变:SomeType<IShape> as SomeType<Circle>
如果每个人都有一个TypeA
转换为另一种类型的书面文件,但没有实现任何通用接口,那么在处理这些类型的泛型转换时谈论协变/逆变是否仍然正确?或者这是一个不同的概念?TypeB
implicit converter
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 ^)'
c# - C#中的协变/逆变
我有一本书解释了逆变/协方差,如下所示:
- 委托可以具有比其方法目标更具体的参数类型。这称为逆变
- 委托的返回类型可以比其目标方法的返回类型更具体。这称为协方差
而且,这是一个例子。
我认为为了使用协方差/逆变,需要使用new
示例中所示的方法,但我似乎使用sa = ActionObject
and 得到了相同的结果o = RetrieveString
。(我用 Mono 测试过)。
- 那么,作者为什么用
new
协方差/逆变来解释呢? - 协方差/逆变思想背后的理论是什么?它只是一个花哨的名字描述
object x = Everything inherit from object
吗?这个奇怪的名字是从哪里来的?它的用途是什么?