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仅出现在输入位置”. 因此“in out T”意味着……什么?正如我们已经看到的,它只能意味着“T在任何方法或财产中根本不会出现.”在T中制作通用类型的重点是什么,你从不使用T? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |