问题标签 [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.
scala - Scala 元组的通用“地图”功能?
我想使用返回类型 R 的单个函数映射 Scala 元组(或三元组,...)的元素。结果应该是一个具有 R 类型元素的元组(或三元组,...)。
OK,如果元组的元素来自相同的类型,映射不是问题:
但是是否也可以使这个解决方案通用,即以相同的方式映射包含不同类型元素的元组?
例子:
应该返回
但是我找不到解决方案,以便映射函数确定 Sub1 和 Sub2 的超类型。我尝试使用类型边界,但我的想法失败了:
这里X >: B
似乎覆盖了X >: A
. Scala 不支持关于多种类型的类型边界吗?如果是,为什么不呢?
c# - 为什么委托逆变不能与值类型一起使用?
此代码段未在 LINQPad 中编译。
编译器的错误信息是:
'UserQuery.IsNull(object)' 没有重载匹配委托 'System.Func'
它适用于字符串数组,但不适用于int[]
. 它显然与拳击有关,但我想知道细节。
inheritance - 我真的不明白这个协/逆变的东西......我不能同时拥有通用的 get 和 set 方法?
我想我会用一些例子来解释我的问题..
所以我需要协方差..
很好,它有效。然后我想使用它:
一切都好,但是 repo 也需要插入对象。使用 out 参数,我们不能这样做:
所以我尝试添加两个参数:
我得到与第一个示例相同的错误。使用时出现同样的错误in TInsert
那么我到底如何才能同时支持插入和获取呢?
编辑:所以我找到了一个可能的解决方案,但它远非最佳
EDIT2:回应 Eric:这是我想要实现的更完整的示例。我真的很想要协方差,所以我可以对 IRepo 实例进行分组,并且我仍然希望它们具有使用模型作为实例的添加/更新方法。我知道我无法获得添加项目的编译时类型安全性,但对于这个用例,我只需要阅读元素。
c# - 在 .NET 4.0 中是否有更优雅的方法来执行此操作?
似乎 C# 4.0 不支持覆盖参数的协方差(使用“in”关键字);是这样吗?
如果是这样,有没有更优雅的方法来做到这一点?
语境
我有一组处理MoreDerivedEvent
. 由于事件处理代码的限制,我只能为 注册一个事件处理程序MoreDerivedEvent
,而且我不知道它会将注册接口作为事件处理(我不相信它会,因为指导是显式使用类)。因此,为了适当地处理事件,我将处理程序定义如下:
这显然不能提供真正的继承,如果我不能解决这个问题,我可能只会展平派生自的DerivedType
类型BaseType
。但我想我会先把它放到 Stack Overflow 社区。
c# - 逆变参数?
这可能是一个愚蠢的问题,但是我有一种方法可以使页面的语法更易于阅读
然后我可以写
但是,我想将 Action 移到 Do 方法中,这样我就可以写得更简单:
但我有点确定如何编写逆变参数来执行 Do 方法?
c# - 同一类型参数的协变和逆变
C# 规范声明参数类型不能同时是协变和逆变的。
这在创建协变或逆变接口时很明显,您分别用“out”或“in”装饰类型参数。没有同时允许两者的选项(“outin”)。
这种限制仅仅是语言特定的限制,还是基于类别理论的更深层次、更根本的原因使您不希望您的类型既是协变的又是逆变的?
编辑:
我的理解是数组实际上既是协变的又是逆变的。
c# - C#中的协方差问题
我有这样声明的类:
在那个类中,我有这个方法:
我认为这是正确的,但我在 return 声明下看到红线,Resharper 说new SavedState(Width, Height)
不能转换为TS
. 我不知道为什么。我认为这TS
可以是任何扩展的类,SavedState
也可以是SavedState
它本身。我能做些什么来纠正它?
类保存状态非常简单,如下所示:
c# - 如何绕过不允许类型变化的 ref 参数?
假设我的数据访问层中有以下类结构:
这让我有我的模型可以实现的各种接口,以及处理这些接口的可重用行为:
并且经理很乐意接受这些,因为IBehavior<T>
.
极好的。
但是现在,我想让每个行为也将一组 LINQ 过滤器应用于实体。我的第一个想法是将此方法添加到IBehavior<T>
:
...其中实施行为将Where
自行决定将一组子句应用于枚举。
However, as it turns out, ref parameters don't allow type variation. I'm struggling to find a way to implement this kind of functionality while maintaining both type safety and the contravariant nature of the interface. Any ideas are appreciated.
c# - 协变和逆变的简单例子
有人可以为我提供简单的 C# 示例,例如协变、逆变、不变性和逆变性(如果存在这种情况)。
到目前为止,我看到的所有样本都只是将一些对象投射到System.Object
.
c# - 我可以实现一个接口,该接口包含接口所需的子类型属性吗?
我收到以下错误:
ClassName.PropertyName 无法实现 IClassType.PropertyName 因为它没有匹配的返回类型 IBasePropertyType
现在,对于代码:
有没有办法做我正在尝试的事情?我知道问题在于协/逆变,但我似乎无法弄清楚如何做到这一点。