问题标签 [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.
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-/和逆变的库,如下所示:
这将允许像这样的转换(不是强制转换!):
你怎么看?可能吗?考虑使用动态代理来做这件事。
c# - 为什么不允许在不同类型参数之间进行转换?
我只是不明白,因为将一个通用容器转换为另一个容器会非常有用吗?
c# - 协变和逆变有什么好处?
C# 4.0 将支持协变和逆变。但我并不清楚这个新功能的好处。你能解释一下(清楚地)我们为什么需要它吗?
c# - 为什么 C#/CLR 不支持方法覆盖协/逆变?
有很多关于破解 C# 的限制的问题和答案,不允许方法返回(和参数)类型在覆盖时更改为兼容类型,但为什么在 C# 编译器或 CLR 中存在此限制?如我所见,如果允许协方差,没有什么可以破坏的,那么它背后的原因是什么?
可以询问类似的问题来扩大访问参数 - 例如用公共方法覆盖受保护的内部方法(Java支持的东西,IIRC)
c# - 如何创建具有继承的泛型类?
如何使以下代码工作?我认为我不太了解 C# 泛型。也许,有人可以指出我正确的方向。
这可能是一个简单的答案。
更新:首先,这在 C# 3.0 中是不可能的,但在 C# 4.0 中是可能的。
要让它在 C# 3.0 中运行,这只是 4.0 之前的一种解决方法,请使用以下命令:
.net - .NET Framework 4.0 中的类型差异
IEnumerable<T>
,IComparable<T>
还有一些现在是类型变体的。IList<T>
,ICollection<T>
而许多其他人不是。为什么?
c# - 泛型类和接口的非泛型版本
我经常发现自己处于创建通用接口或类的情况,然后想以非通用方式使用此类或接口的不同版本。例如我可能有这样的界面:
这允许一个类成为该类型的工厂。然后我想用一个通用的工厂类注册这些,所以我试着写这样的东西:
在字典中,我使用哪种类型来表示我的价值?我不知道我是否遗漏了某种设计原则,我知道这与 co(ntra?)variance 有很大关系。任何帮助或想法将不胜感激。
c# - C#:覆盖返回类型
有没有办法覆盖 C# 中的返回类型?如果是这样,如何,如果不是,为什么以及推荐的方法是什么?
我的情况是我有一个带有抽象基类及其后代的接口。我想这样做(不是真的,但作为一个例子!):
RadioactivePoo
当然继承自Poo
.
我想要这样做的原因是,那些使用Cat
对象的人可以使用该Excrement
属性而不必Poo
投入RadioactivePoo
其中,例如,Cat
它仍然可能是Animal
用户可能不一定知道或关心他们的放射性便便的列表的一部分。希望这是有道理的...
据我所知,编译器至少不允许这样做。所以我想这是不可能的。但是你会推荐什么来解决这个问题?
c# - C#:方差(协方差/逆变)是多态性的另一个词吗?
我试图从网上的几篇文章和 StackOverflow 上的问题中弄清楚这些词的确切含义,据Covariance
我Contravariance
所知,这只是polymorphism 的另一个词。
我对上述说法是否正确?还是我弄错了?
c++ - 协变虚函数和智能指针
在 C++ 中,子类可以在重写虚函数时指定不同的返回类型,只要返回类型是原始返回类型的子类(并且两者都作为指针/引用返回)。
是否可以将此功能扩展到智能指针?(假设智能指针是一些模板类)
为了显示:
编辑:正如康拉德鲁道夫建议的那样,这不是直接可能的。但是,我遇到了这种方法:
你会建议走这条路吗?