C# · 12月 24, 2021

c#-4.0 – 我可以使用一种既有协变性又有逆变性的类型,即具有子类型和超类型的完全可替换/可更改的类型?

我可以有一个类型(现在忘记它的语义),它可以是协变的还是逆变的?

例如:

public interface Foo<in out T>{ void DoFooWith(T arg);}

关于Eric Lippert的博客,了解C#4.0中的差异肉和土豆,因为除此之外几乎没有什么能够涵盖这个主题的充分理由.

无论如何我试了一下,不仅不允许这样做,而且它告诉我,我错过了重点.我需要理解只读,只写和方差之间的联系.

我想我还有更多的阅读要做.

但同时,欢迎任何短暂的,顿悟的诱导答案.

解决方法 不,你做不到.

假设这是合法的.你制作一个IFoo< Giraffe>.由于IFoo在T中是协变的,因此您可以通过类型安全引用转换将其转换为IFoo< object>.由于它是逆变的,您可以将其转换为IFoo< Banana>. IFoo< T>有哪些可能的语义?这样能够通过参考转换将长颈鹿的IFoo转换成香蕉的IFoo是有意义的吗?除了作为参考类型之外,长颈鹿和香蕉没有任何共同之处.你不可能在IFoo< Banana>上有一个方法.返回香蕉,因为它实际上可能是IFoo< Giraffe>的实现;实施的作者如何知道分发香蕉?你不可能在IFoo< Banana>上有一个方法.出于同样的原因需要香蕉; IFoo< Giraffe>的实现者期待你交给他长颈鹿.

这是另一种看待它的方式:

>“in T”表示(粗略地)“T仅出现在输入位置”.
>“out T”表示(粗略地)“T仅出现在输出位置”.

因此“in out T”意味着……什么?正如我们已经看到的,它只能意味着“T在任何方法或财产中根本不会出现.”在T中制作通用类型的重点是什么,你从不使用T?