相关疑难解决方法(0)

仍然对协方差和逆变与输入/输出感到困惑

好吧,我在stackoverflow上读了一下这个主题,看了这个&这个,但仍然有点混淆co/contra-variance.

这里开始

协方差允许在API中替换"更大"(更不具体)类型,其中原始类型仅用于"输出"位置(例如,作为返回值).逆变量允许在API中替换"较小"(更具体)类型,其中原始类型仅用于"输入"位置.

我知道它与类型安全有关.

关于这in/out件事.我可以说in当我需要写它时,我会使用它,out当它只读它时.并且in意味着反方差,out协方差.但从上面的解释......

例如,a List<Banana>不能被视为List<Fruit>因为 list.Add(new Apple())对List有效但不适用于List<Banana>.

所以不应该是,如果我要使用in/我要写入对象,它必须更大更通用.

我知道这个问题已经被问到但仍然很困惑.

c# covariance

45
推荐指数
6
解决办法
1万
查看次数

支持单个类型参数的协方差和逆变

可能重复:
同一类型参数的协方差和反演

您可以使用out关键字将泛型类型参数声明为协变:

interface ICovariant<out R>
Run Code Online (Sandbox Code Playgroud)

您可以使用in关键字将泛型类型参数声明为逆变量:

interface IContravariant<in R>
Run Code Online (Sandbox Code Playgroud)

您还可以支持不同类型的参数:

interface IVariant<out R, in A>
Run Code Online (Sandbox Code Playgroud)

那么为什么你不能支持单一类型参数呢?

c# generics interface covariance contravariance

8
推荐指数
2
解决办法
2202
查看次数

标签 统计

c# ×2

covariance ×2

contravariance ×1

generics ×1

interface ×1