8

C#4.0でインターフェイスを定義する場合、各ジェネリックパラメーターをinまたはとしてマークすることができますout。ジェネリックパラメーターをoutとして設定しようとして問題が発生した場合、コンパイラーはエラーを発生させ、それを許可しません。

質問:

covarianceコンパイラに(out)とcontravariance( )の両方の有効な使用法を推測する方法がある場合in、なぜインターフェイスをそのようにマークする必要があるのでしょうか。いつものようにインターフェイスを定義するだけで十分ではないでしょうか。クライアントコードでインターフェイスを使用しようとしたときに、安全でない方法で使用しようとするとエラーが発生します。

例:

interface MyInterface<out T> {
    T abracadabra();
}
//works OK

interface MyInterface2<in T> {
    T abracadabra();
}
//compiler raises an error.
//This makes me think that the compiler is cappable 
//of understanding what situations might generate 
//run-time problems and then prohibits them.

また、

同じ状況でJa​​vaが行うことではありませんか?私が覚えていることから、あなたはただのようなことをします

IMyInterface<? extends whatever> myInterface; //covariance
IMyInterface<? super whatever> myInterface2; //contravariance

それとも私は物事を混ぜていますか?

ありがとう

4

2 に答える 2

8

コンパイラーに共分散(out)と反変性(in)の両方の有効な使用法を推測する方法がある場合、なぜインターフェースをそのようにマークする必要があるのですか?

質問を理解できるかどうかはよくわかりません。私はあなたが2つのことを求めていると思います。

1)コンパイラは分散注釈を推測できますか?

2)C#がJavaのように呼び出しサイトの差異をサポートしないのはなぜですか?

最初の答えは次のとおりです。

interface IRezrov<V, W> 
{
    IRezrov<V, W> Rezrov(IRezrov<W, V> x);
}

法的に考えられるすべての分散注釈がVとWにあるかどうかを推測してみてください。驚くかもしれません。

このメソッドの一意の最良の分散アノテーションを理解できない場合、なぜコンパイラーが理解できると思いますか?

ここでのその他の理由:

http://blogs.msdn.com/ericlippert/archive/2007/10/29/covariance-and-contravariance-in-c-part-seven-why-do-we-need-a-syntax-at-all。 aspx

より一般的には、あなたの質問は誤った推論を示しています。解決策が正しいかどうかを安価にチェックできるということは、正しい解決策を見つけるための安価な方法があることを論理的に意味するものではありません。たとえば、コンピュータは、2000桁の素数pとqについてp * q==rが真であるか偽であるかを簡単に確認できます。これは、rを取り、等式が満たされるようにpとqを見つけるのが簡単であることを意味するものではありません。コンパイラーは、差異注釈が正しいか正しくないかを簡単にチェックできます。これは、潜在的に数十億の可能な注釈の中から正しい分散注釈を見つけることができるという意味ではありません。

2番目の答えは次のとおりです。C#はJavaではありません。

于 2010-04-29T00:26:22.657 に答える
0

OK、これが私が尋ねたものに対する答えです(エリックの答えから): http: //blogs.msdn.com/ericlippert/archive/2007/10/29/covariance-and-contravariance-in-c-part-seven- why-do-we-need-a-syntax-at-all.aspx

まず、分散は、インターフェイスまたはデリゲートに意図的に設計するものでなければならないように思われます。ユーザーによる制御なしでそれが起こり始めるようにすることは、その目標に反し、また、重大な変更をもたらす可能性があります。(それらについては後の投稿で詳しく説明します!)

これを自動的に行うことは、開発プロセスが進行し、メソッドがインターフェースに追加されるときに、インターフェースの差異が予期せず変化する可能性があることも意味します。これにより、プログラムの他の場所で予期しない広範囲にわたる変更が発生する可能性があります。

彼のリンクには私の質問に対する答えがありますが、投稿自体には答えがないため、ここに明示的に記載することにしました。

于 2010-04-29T00:40:18.357 に答える