2016-06-22 11 views
0

this msdn documentation共分散および反分散については、outキーワードを使用して汎用パラメータ共変を宣言することが説明されています。代理人の共分散については、msdnのマニュアルに間違いがありますか?

outキーワードを使用すると、汎用型パラメータ共変を宣言できます。

はその後outキーワードの使用方法の一例を与えられ、その後、このステートメントは、「私が呼ばれるべきだと思うおり、「反変」であるメソッドのパラメータとしてデリゲートについて言われているにしていなぜならそれはまだoutと表示されているからです。

このルールには1つの例外があります。 反例のジェネリックデリゲートをメソッドパラメータとして使用している場合は、その型をデリゲートのジェネリック型パラメータとして使用できます。

は、この例では、次のとおりです。

interface ICovariant<out R> 
{ 
    void DoSomething(Action<R> callback); 
} 

を共変ではなく、反変と呼ばれるデリゲートパラメータではないでしょうか?

+1

'Action ' *は反例です;共変ではありません。 – Servy

答えて

0

Servyのコメントから、私は文章が何であるか理解していましたが、それは対照的でないインターフェースではありませんでした。Action<T>は一般的な反則的な代理人です。だからmsdnのドキュメントは正しかった、私は、文章がインタフェースのジェネリック型パラメータに関するものだと思ったとき、私は誤解していました。それはこの方法です:

interface ICovariant<out R> //this is covariant 
{ 
    void DoSomething(Action<R> callback); //this is contravariant 
} 
+0

分散はジェネリック型パラメータに適用されるので、 'ICvariant'で共変する' R'です。 Contravarianceはサブ/スーパータイプの関係を逆転させ、 'Action'代理人のパラメータ型は反変です。逆変異的な位置での反変的なパラメータの使用は、順序が逆転されてから再び逆転するので、共変である。 – Lee

+0

@Leeのように、インタフェースのパラメータRは、outキーワードからわかるように、共変(covariant)です。しかし、それは行動に渡されるときに反反者に変換されます。その後、共変に変換されているのはなぜですか?私が見るものは、反変的な位置に共変パラメータを使用することです... – meJustAndrew

+0

引数型 'T'は' Action 'に反変的で、' callback'は反変的な位置にあるので、あなたは反変異的な位置であり、これは共変である。 – Lee

関連する問題