2013-05-24 10 views
7

は、このインタフェースを考えてみましょう。なぜこの共分散宣言はコンパイルされますか?</p> <pre><code>interface Test<out T> where T : struct { } </code></pre> <p>それはエラーや警告なしでコンパイル:

this questionで論じ、そしてthe Covariance and Contravariance FAQで述べたように:

分散は、型パラメータが参照型である場合にのみサポートされています。

なぜ上記のインターフェイスはコンパイルされますか? "out"キーワードに失敗する(または少なくとも警告する)のは意味があります。私は上記の例のoutキーワードを使用すると違いがあるのでしょうか?


更新は:コーダがのために働いていない分散を認識していない場合は

typeof(IDummy).IsAssignableFrom(typeof(MyStruct)); // should return true 
typeof(ITest<IDummy>).IsAssignableFrom(typeof(ITest<MyStruct>)); // returns false 

:ここでは、上記のインターフェイスを見て気づいていない開発者のためのすり抜けも例誤解を招く行動です2番目の行がoutキーワードのためにtrueを返すと予想しますが、それは決してありません。 (

ITest<MyStruct> foo = ...; 
var casted = (ITest<IDummy>)foo; 

私はこれが動作するように期待する:これは、この質問をするために私を促したバグ...


コンパイルが、予期しない結果を生成するコードの別の例正確です参照型への共分散の制限についてはわかりませんが)、System.InvalidCastExceptionが発生します。

答えて

2

上記の例でoutキーワードを使用しても差はありますか?

いいえ。宣言にoutを指定することは許されていますが、その型の特定のインスタンスを扱うときには実際にはそれを活用することはできません。

このプログラムの何も正常に動作しないため、基本的にの機能要求は、開発者の間違いの可能性があるため、コンパイラのこの動作を禁止しています。その要求に対する応答は、マイクロソフトがこれをオプションとして考慮しなかった(または他の機能要求と同じように)か、そうした場合でも、この動作を積極的に禁止する時間と労力がかかりませんでした。

+0

その場合、私はそれをコンパイラのバグだと考えます。分散効果のないキーワードを使用することはできません。 – sinelaw

+1

@sinelaw:私はあなたに同意します。私のせい。私はこの機能を設計するときにこれを考慮したことはありません。私のmea culpaについては、http://stackoverflow.com/questions/9353293/c-sharp-variance-annotation-of-a-type-parameter-constrained-to-be-value-typeを参照してください。 –

+0

@EricLippert、ありがとう!あなたが言ったように「おそらくそこには開発者がいて、それが動作すると思うように入力するかもしれない」 - 私はそれが私だと思います。 :) – sinelaw

関連する問題