質問

一般的な型がC#4.0のCoまたはContraバリアントであることを示すためにoutまたはinパラメーターを追加する必要がある理由を誰かが説明できますか?

これがなぜ重要なのか、なぜコンパイラがそれを理解できないのかを理解しようとしています。

ありがとう、

ジョシュ

役に立ちましたか?

解決

langaugeで作業しているEric Lippertには、関連する問題を明確にするのに役立つmsdnに関する一連の投稿があります。
http://blogs.msdn.com/ericlippert/ archive / tags / Covariance + and + Contravariance / default.aspx

そのリンクに表示されている記事を読むときは、一番下から始めて仕上げてください。

やがて#7(なぜ構文が必要なのですか?)

他のヒント

実際にはそれらを必要しません。クラスでabstractまたはoutrefの両方が必要になります。それらは、プログラマーとして意図を明確にするために存在し、メンテナンスプログラマーが私たちが何をしているかを理解し、コンパイラーが私たちがそれを正しく行っていることを確認できるようにするためだけに存在します。

まあ、主な問題は、次のようなクラス階層がある場合です:

   class Foo { .. } 

   class Bar : Foo { .. } 

そして、あなたはIEnumerator<Bar>を持っているので、それが完全に安全であってもIEnumerator<Foo>として使用することはできません。 3.5では、これにより多数の痛みを伴う旋回が強制されます。この操作は常に安全ですが、ジェネリック型パラメーターの共変の使用については知らないため、型システムによって拒否されます。 BarFooのみを返すことができ、すべてのIEqualityComparer<Foo>IEqualityComparer<Bar>です。

同様に、<=>があれば、片方または両方が<=>であっても<=>型のオブジェクトのペアを比較するために使用できますが、<=>にキャストすることはできません。ジェネリック型パラメーターの反変の使用については知りません。 <=>はタイプ<=>のオブジェクトのみを消費し、すべての<=>は<=>です。

これらのキーワードがないと、メソッドへの引数とメソッドの結果型の両方としてジェネリック引数が発生する可能性があると強制されるため、上記の変換のいずれも安全に許可できません。

これらにより、型システムは、キーワードで示された方向にこれらのインターフェース間で安全にアップキャストおよびダウンキャストできるようになり、その安全性を確保するために必要な規律に違反する場合を示すエラーが表示されます。

inおよびoutキーワードはC#1.0以降のキーワードであり、メソッドへの<=>-および<=>-パラメーターのコンテキストで使用されています。

共分散と反分散は、インターフェイスの実装方法に対する制約です。それらを推測する良い方法はありません-私が思うに、唯一の方法は使用法からであり、それは面倒で、結局は機能しません。

JonとJoelは両方ともこれに対する非常に完全な答えを提供しましたが、一番下の行は、コンパイラがそれほど必要ではなく、明示的に示すことで実装の安全性を保証するのに役立ちますパラメータの分散。これは、呼び出し元サイトと宣言サイトの両方でoutまたはrefキーワードを必要とするパターンと非常に似ています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top