好吧,我在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/我要写入对象,它必须更大更通用.
我知道这个问题已经被问到但仍然很困惑.
可能重复:
同一类型参数的协方差和反演
您可以使用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)
那么为什么你不能支持单一类型参数呢?