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

scala - Scala 元组的通用“地图”功能?

我想使用返回类型 R 的单个函数映射 Scala 元组(或三元组,...)的元素。结果应该是一个具有 R 类型元素的元组(或三元组,...)。

OK,如果元组的元素来自相同的类型,映射不是问题:

但是是否也可以使这个解决方案通用,即以相同的方式映射包含不同类型元素的元组?

例子:

应该返回

但是我找不到解决方案,以便映射函数确定 Sub1 和 Sub2 的超类型。我尝试使用类型边界,但我的想法失败了:

这里X >: B似乎覆盖了X >: A. Scala 不支持关于多种类型的类型边界吗?如果是,为什么不呢?

0 投票
3 回答
999 浏览

c# - 为什么委托逆变不能与值类型一起使用?

此代码段未在 LINQPad 中编译。

编译器的错误信息是:

'UserQuery.IsNull(object)' 没有重载匹配委托 'System.Func'

它适用于字符串数组,但不适用于int[]. 它显然与拳击有关,但我想知道细节。

0 投票
2 回答
364 浏览

inheritance - 我真的不明白这个协/逆变的东西......我不能同时拥有通用的 get 和 set 方法?

我想我会用一些例子来解释我的问题..

所以我需要协方差..

很好,它有效。然后我想使用它:

一切都好,但是 repo 也需要插入对象。使用 out 参数,我们不能这样做:

所以我尝试添加两个参数:

我得到与第一个示例相同的错误。使用时出现同样的错误in TInsert

那么我到底如何才能同时支持插入和获取呢?

编辑:所以我找到了一个可能的解决方案,但它远非最佳

EDIT2:回应 Eric:这是我想要实现的更完整的示例。我真的很想要协方差,所以我可以对 IRepo 实例进行分组,并且我仍然希望它们具有使用模型作为实例的添加/更新方法。我知道我无法获得添加项目的编译时类型安全性,但对于这个用例,我只需要阅读元素。

0 投票
2 回答
210 浏览

c# - 在 .NET 4.0 中是否有更优雅的方法来执行此操作?

似乎 C# 4.0 不支持覆盖参数的协方差(使用“in”关键字);是这样吗?

如果是这样,有没有更优雅的方法来做到这一点?

语境

我有一组处理MoreDerivedEvent. 由于事件处理代码的限制,我只能为 注册一个事件处理程序MoreDerivedEvent,而且我不知道它会将注册接口作为事件处理(我不相信它会,因为指导是显式使用类)。因此,为了适当地处理事件,我将处理程序定义如下:

这显然不能提供真正的继承,如果我不能解决这个问题,我可能只会展平派生自的DerivedType类型BaseType。但我想我会先把它放到 Stack Overflow 社区。

0 投票
1 回答
257 浏览

c# - 逆变参数?

这可能是一个愚蠢的问题,但是我有一种方法可以使页面的语法更易于阅读

然后我可以写

但是,我想将 Action 移到 Do 方法中,这样我就可以写得更简单:

但我有点确定如何编写逆变参数来执行 Do 方法?

0 投票
7 回答
3131 浏览

c# - 同一类型参数的协变和逆变

C# 规范声明参数类型不能同时是协变和逆变的。

这在创建协变或逆变接口时很明显,您分别用“out”或“in”装饰类型参数。没有同时允许两者的选项(“outin”)。

这种限制仅仅是语言特定的限制,还是基于类别理论的更深层次、更根本的原因使您不希望您的类型既是协变的又是逆变的?

编辑:

我的理解是数组实际上既是协变的又是逆变的。

0 投票
2 回答
176 浏览

c# - C#中的协方差问题

我有这样声明的类:

在那个类中,我有这个方法:

我认为这是正确的,但我在 return 声明下看到红线,Resharper 说new SavedState(Width, Height)不能转换为TS. 我不知道为什么。我认为这TS可以是任何扩展的类,SavedState也可以是SavedState它本身。我能做些什么来纠正它?

类保存状态非常简单,如下所示:

0 投票
2 回答
269 浏览

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.

0 投票
3 回答
11734 浏览

c# - 协变和逆变的简单例子

有人可以为我提供简单的 C# 示例,例如协变、逆变、不变性和逆变性(如果存在这种情况)。

到目前为止,我看到的所有样本都只是将一些对象投射到System.Object.

0 投票
2 回答
3932 浏览

c# - 我可以实现一个接口,该接口包含接口所需的子类型属性吗?

我收到以下错误:

ClassName.PropertyName 无法实现 IClassType.PropertyName 因为它没有匹配的返回类型 IBasePropertyType

现在,对于代码:

有没有办法做我正在尝试的事情?我知道问题在于协/逆变,但我似乎无法弄清楚如何做到这一点。