Wat*_* v2 6 covariance contravariance variance c#-4.0
我可以有一个类型(现在忘记它的语义),它可以是协变的还是逆变的?
例如:
public interface Foo<in out T>
{
void DoFooWith(T arg);
}
Run Code Online (Sandbox Code Playgroud)
关于Eric Lippert的博客,了解C#4.0中的差异肉和土豆,因为除此之外几乎没有什么能够涵盖这个主题的充分理由.
无论如何我试了一下,不仅不允许这样做,而且它告诉我,我错过了重点.我需要理解只读,只写和方差之间的联系.
我想我还有更多的阅读要做.
但同时,欢迎任何短暂的,顿悟的诱导答案.
Eri*_*ert 10
不,你做不到.
假设这是合法的.你做了一个IFoo<Giraffe>.由于IFoo在T中是协变的,因此您可以通过类型安全引用转换将其转换为IFoo<object>.由于它是逆变的,你可以将其转换为IFoo<Banana>.有什么可能的语义IFoo<T>,以便能够通过引用转换将长颈鹿的IFoo转换为香蕉的IFoo是有意义的吗?除了作为参考类型之外,长颈鹿和香蕉没有任何共同之处.你不可能有一个IFoo<Banana>返回香蕉的方法,因为它实际上可能是一个实现IFoo<Giraffe>; 实施的作者如何知道分发香蕉?IFoo<Banana>出于同样的原因,你不可能有一个香蕉的方法; IFoo<Giraffe>期待你把他交给长颈鹿的实施者.
这是另一种看待它的方式:
因此"in out T"意味着......什么?正如我们已经看到的,它只能意味着"T在任何方法或财产中根本不会出现." 在T中制作通用类型的重点是什么,你从不使用T?
| 归档时间: |
|
| 查看次数: |
624 次 |
| 最近记录: |