问题标签 [covariance]

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 投票
2 回答
192 浏览

c#-3.0 - 我应该在 C#3.0 中支持 Pub-/Sub-Scenarios 的 Co-/Contravariance 吗?

在我的应用程序中,我正在创建一个简单的事件中心,它为注册订阅者提供了一些东西:

并用于发布事件。

非常简单。我想路由Publish<int>(0)到所有实现的订阅者ISubscriber<int>.

不太难的是,我希望订阅者 EventType 是逆变的。所以ISubscriber<object>基本上应该消耗掉一切。我不希望他们也使用值类型。

用 C#4 没问题,但现在我用 C#3 做这些事情,只是用接口假装逆变:

好吧,现在,我想像这样将数据打包成“事件类型”。该事件的通用参数必须是协变的。

当我发布Publish<DataChanged<B>>(new DataChanged<B>(new B())(给定 B:A)时,应通知订阅者DataChanged<A>Data 是传递给的 B 实例的位置DataChanged<B>。所以我也需要协方差支持。

我想编写一个支持 Co-/和逆变的库,如下所示:

这将允许像这样的转换(不是强制转换!):

你怎么看?可能吗?考虑使用动态代理来做这件事。

0 投票
3 回答
303 浏览

c# - 为什么不允许在不同类型参数之间进行转换?

我只是不明白,因为将一个通用容器转换为另一个容器会非常有用吗?

0 投票
4 回答
2301 浏览

c# - 协变和逆变有什么好处?

C# 4.0 将支持协变和逆变。但我并不清楚这个新功能的好处。你能解释一下(清楚地)我们为什么需要它吗?

0 投票
5 回答
3169 浏览

c# - 为什么 C#/CLR 不支持方法覆盖协/逆变?

有很多关于破解 C# 的限制的问题和答案,不允许方法返回(和参数)类型在覆盖时更改为兼容类型,但为什么在 C# 编译器或 CLR 中存在此限制?如我所见,如果允许协方差,没有什么可以破坏的,那么它背后的原因是什么?

可以询问类似的问题来扩大访问参数 - 例如用公共方法覆盖受保护的内部方法(Java支持的东西,IIRC)

0 投票
2 回答
1120 浏览

c# - 如何创建具有继承的泛型类?

如何使以下代码工作?我认为我不太了解 C# 泛型。也许,有人可以指出我正确的方向。

这可能是一个简单的答案。

更新:首先,这在 C# 3.0 中是不可能的,但在 C# 4.0 中是可能的。

要让它在 C# 3.0 中运行,这只是 4.0 之前的一种解决方法,请使用以下命令:

0 投票
3 回答
550 浏览

.net - .NET Framework 4.0 中的类型差异

IEnumerable<T>IComparable<T>还有一些现在是类型变体的。IList<T>ICollection<T>而许多其他人不是。为什么?

0 投票
2 回答
1736 浏览

c# - 泛型类和接口的非泛型版本

我经常发现自己处于创建通用接口或类的情况,然后想以非通用方式使用此类或接口的不同版本。例如我可能有这样的界面:

这允许一个类成为该类型的工厂。然后我想用一个通用的工厂类注册这些,所以我试着写这样的东西:

在字典中,我使用哪种类型来表示我的价值?我不知道我是否遗漏了某种设计原则,我知道这与 co(ntra?)variance 有很大关系。任何帮助或想法将不胜感激。

0 投票
15 回答
58196 浏览

c# - C#:覆盖返回类型

有没有办法覆盖 C# 中的返回类型?如果是这样,如何,如果不是,为什么以及推荐的方法是什么?

我的情况是我有一个带有抽象基类及其后代的接口。我想这样做(不是真的,但作为一个例子!):

RadioactivePoo当然继承自Poo.

我想要这样做的原因是,那些使用Cat对象的人可以使用该Excrement属性而不必Poo投入RadioactivePoo其中,例如,Cat它仍然可能是Animal用户可能不一定知道或关心他们的放射性便便的列表的一部分。希望这是有道理的...

据我所知,编译器至少不允许这样做。所以我想这是不可能的。但是你会推荐什么来解决这个问题?

0 投票
5 回答
7023 浏览

c# - C#:方差(协方差/逆变)是多态性的另一个词吗?

我试图从网上的几篇文章和 StackOverflow 上的问题中弄清楚这些词的确切含义,据CovarianceContravariance所知,这只是polymorphism 的另一个词

我对上述说法是否正确?还是我弄错了?

0 投票
2 回答
1624 浏览

c++ - 协变虚函数和智能指针

在 C++ 中,子类可以在重写虚函数时指定不同的返回类型,只要返回类型是原始返回类型的子类(并且两者都作为指针/引用返回)。

是否可以将此功能扩展到智能指针?(假设智能指针是一些模板类)

为了显示:

编辑:正如康拉德鲁道夫建议的那样,这不是直接可能的。但是,我遇到了这种方法:

你会建议走这条路吗?