問題タブ [contravariance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#4.0の共変性/反変性がパラメーター化されたインターフェイスとデリゲート型に制限されているのはなぜですか?
これはCLRの制限ですか、それとも既存のコードとの互換性の問題がありますか?
これは、C#4.0でのデリゲート結合の混乱した分散に関連していますか?
編集:CLRでその制限を実行せずに、共変性/反変性を使用する言語を使用することは可能でしょうか?
c# - C#4.0での共変性と反変性の優れた実際のユースケースの例は?
C#4.0がリリースされる前は、共変性と反変性に非常に興奮していました。それは理論的な正しさのために私の愛情に甘んじました!
しかし、それが終わって、私は通常の、毎日の、退屈なコードを書くことに戻ったので、私は疑問に思い始めています:私はまだそれを使用したことがありますか?そして、私はそれを意識的に使用していないことに気づきました。それ以来、私が定義したインターフェースやデリゲートはどれもその恩恵を受けていません。
後で無意識のうちに共分散を使用していることに気付いたのは1つのケースだけですが、それは非常に微妙であり、気付かなかった可能性もあります。想像してみてくださいX
。これは基本クラスでY
あり、その子孫です。
共分散または反変性を実際の非考案のユースケースで使用し、見事に「正しい」ことで1日を本当に節約した、興味深いまたはエキサイティングな例はありますか?
events - イベント プロパティの反変性の問題
単純な EventArgs サブクラスがあるとします。
イベントを持つ 2 つのクラスがあるとします。
そして、それらを使用する簡単なプログラム:
反変性のおかげで、MyMethod は EventHandler と EventHandler<MyArgs> の両方としてカウントされます。ただし、MyObject のイベント ハンドラーを、メソッドを MyData に転送するプロパティに変更すると、次のようになります。
イベント プロパティは、EventHandler を EventHandler に転送できません。これは、反変性のカテゴリに分類されるように思われるため、私には奇妙に思えます。より弱い署名 (基本クラス) を持つハンドラーは、より強い署名 (サブクラス) を持つ引数を受け入れることができるはずです。
C# でこれができないのはなぜですか? 一般的な EventHandler をイベント プロパティを通じて EventHandler にトンネリングする方法はありますか? デリゲートに対して実行できる何らかの合法的なキャストはありますか?
c# - ジェネリック インターフェイスが既定で共変/反変でないのはなぜですか?
IEnumerable<T>
インターフェースの例:
このインターフェイスでは、ジェネリック型はインターフェイス メソッドの戻り値の型としてのみ使用され、メソッド引数の型としては使用されないため、共変になる可能性があります。これを考えると、コンパイラは理論的にインターフェイスからの差異を推測できませんか? 可能であれば、C# で co/contravariance キーワードを明示的に設定する必要があるのはなぜですか。
更新:Jon Skeet が言及したように、この質問はサブ質問になります。
コンパイラは、現在のジェネリック型とそのすべての基本型の中でどのように使用されているかによって、ジェネリック型の相互/反変性を推測できますか?
たとえば、.NET Framework 4.0 のジェネリック インターフェイス パラメーターのうち、あいまいさなしに共変/反変として自動的にマークできるものはいくつありますか? 約70%、80%、90%、または100%?
可能であれば、デフォルトでジェネリック型に共/反変性を適用する必要がありますか? 少なくとも、型の使用法から共変/反変を分析および推測できる型に対して。
scala - インライン化時のコンパイル/ランタイム エラーの欠落
Scalaに次のクラス/特性があります
Write トレイトの反変性のおかげで、オブジェクトのリストまたは数値のリストを使用してメソッドを呼び出すことができます。
Integer のリストで bar を呼び出すと、Scala でコンパイル エラーが発生します。これは予期されることです。Number のスーパータイプではない整数 (ただし、サブタイプ)
しかし、整数のリストの変数宣言をインライン化すると、コンパイル エラーがなくなり、動作しているように見えます。(メソッドバーのリストに要素を追加できます)
編集:太字でRex Kerrへの回答thx
1) これはどのように可能ですか? 最初のタイプの整数が選択され、数値がインライン化されます
2) インライン展開なしではなぜそうならないのですか? Scala は適切な型を取ることができます
3) 実行時エラーが発生しないのはなぜですか? リストは共変であるため
Ps。トレイトとラッパーがなくても、制限付きで反変性を得ることができることはわかっています。
c#-4.0 - クラスではなく、ジェネリック型引数の .NET 4 差異が生じるのはなぜですか?
重複の可能性:
C# 4.0 のクラスに一般的な差異がないのはなぜですか?
C# (4.0) がジェネリック クラス型で共変性と反変性を許可しないのはなぜですか?
ジェネリック型引数の新しい .NET 4.0 共変性と反変性は、インターフェイスとデリゲートに対してのみ機能します。クラスでもサポートしない理由は何ですか?
java - 反変性はJavaジェネリックでどのように使用されますか?
Java では、共分散により、API 設計者は、インスタンスが特定の型またはその型のサブタイプのいずれかとして一般化される可能性があることを指定できます。例えば:
反変性は逆です。インスタンスが特定のタイプまたはスーパータイプとして一般化される可能性があることを指定できます。
Javaジェネリックの反変性はどのように役立ちますか? いつ使用することを選択しますか?
c# - C# 4.0 ジェネリックと ASP.net MVC
C# 4.0 では、バリアンス指定子はインターフェイス タイプにのみ適用されるようです。
では、ViewModel / EditModel クラスとモデルの単純な階層があるとしましょう。
任意のタイプの MyEditModel (Base から派生している限り) を受け入れる部分ビューと、Derived1 のインスタンスのみを受け入れる別のビューがあります。同じページに両方をレンダリングするにはどうすればよいですか?
任意の MyEditModel を受け入れる部分ビューは、Derived1 のエディターと Derived2 のエディターの間で共有されます。
c#-4.0 - LSPとの共変性と反変性
LSPと共変性と反変性の関係は何ですか?何か関係はありますか?LSPは共分散の一形態ですか?