7

共変でも反変でもよい型 (今のところセマンティクスは忘れています) を使用できますか?

例えば:

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

C# 4.0 の分散の本質については、Eric Lippert のブログを参照してください。


とにかく試してみましたが、それが許可されていないだけでなく、要点全体が欠けていることがわかりました。読み取り専用、書き込み専用、バリアンスの間のリンクを理解する必要があります。

もっと読むべきことがあると思います。

しかし、それまでの間、ひらめきを誘発する短い答えは大歓迎です。

4

1 に答える 1

11

いいえ、それはできません。

それが合法だったとしましょう。あなたが作るIFoo<Giraffe>。IFoo は T で共変であるため、タイプセーフな参照変換を介して に変換できますIFoo<object>。これは反変であるため、 に変換できますIFoo<Banana>IFoo<T>参照変換を介してキリンの IFoo をバナナの IFoo に変換できることが理にかなっているような、可能なセマンティクスは何ですか? キリンとバナナには、参照型であること以外に共通点はありません。実際には;IFoo<Banana>の実装である可能性があるため、Banana を返すメソッドを on にすることはできません。IFoo<Giraffe>実装の作成者は、バナナを配布する方法をどのように知るのでしょうか? IFoo<Banana>同じ理由で Banana を取るメソッドを使用することはできません。の実装者IFoo<Giraffe>は、あなたが彼にキリンを渡すことを期待しています。

別の見方を次に示します。

  • 「in T」とは、(大まかに)「T は入力位置にのみ現れる」という意味です。
  • 「out T」は、(大まかに)「T は出力位置にのみ現れる」ことを意味します。

したがって、「イン アウト T」は、何を意味するのでしょうか。すでに見てきたように、これは「T がどのメソッドまたはプロパティにもまったく現れない」ことを意味するだけです。 T をまったく使用しない T でジェネリック型を作成する意味は何ですか?

于 2010-05-14T15:22:12.330 に答える