7

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

例如:

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

转至 Eric Lippert 的博客,了解 C# 4.0 中的差异,因为几乎没有其他任何地方涵盖了该主题的充分基础。


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

我想我还有一些阅读要做。

但与此同时,任何简短的、顿悟的答案都是受欢迎的。

4

1 回答 1

11

不,你不能那样做。

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

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

  • “在 T 中”意味着(大致)“T 仅出现在输入位置”。
  • “out T”意味着(大致)“T 仅出现在输出位置”。

因此“in out T”将意味着......什么?正如我们已经看到的,它只能表示“T 根本没有出现在任何方法或属性中”。 在 T 中创建一个从不使用 T 的泛型类型有什么意义?

于 2010-05-14T15:22:12.330 回答