我可以有一个可以协变和逆变的类型(现在忘记它的语义)吗?
例如:
public interface Foo<in out T>
{
void DoFooWith(T arg);
}
转至 Eric Lippert 的博客,了解 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>使得能够通过引用转换将 Giraffes 的 IFoo 转换为 Bananas 的 IFoo 是有意义的?除了引用类型之外,Giraffes 和 Bananas 没有任何共同之处。你不可能有一个IFoo<Banana>返回香蕉的方法,因为它实际上可能是 ; 的实现IFoo<Giraffe>。实现的作者如何知道分发香蕉?出于同样的原因,你不可能有一个IFoo<Banana>需要香蕉的方法;的实现者IFoo<Giraffe>希望你给他一只长颈鹿。
这是另一种看待它的方式:
因此“in out T”将意味着......什么?正如我们已经看到的,它只能表示“T 根本没有出现在任何方法或属性中”。 在 T 中创建一个从不使用 T 的泛型类型有什么意义?