問題タブ [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) がジェネリック クラス型で共変性と反変性を許可しないのはなぜですか?
その制限の本当の理由は何ですか?しなければならなかったのはただの仕事ですか?概念的に難しいですか?無理ですか?
確かに、フィールドは常に読み書き可能であるため、型パラメーターをフィールドで使用することはできません。でもそれじゃ答えにならないよね?
この質問の理由は、私が C# 4 のバリアンス サポートに関する記事を書いているためであり、それがデリゲートとインターフェイスに制限されている理由を説明する必要があると感じています。立証責任を逆転させるだけです。
更新: Eric が例について尋ねました。
これはどうですか(それが理にかなっているのかどうかはまだわかりません:-))
それを 1 つのクラスに持つ理由は、クラス自体に保持されているキャッシュである可能性があります。また、異なる種類のペットに同じ名前を付けないでください。
ところで、これはC# 5.0 のオプションの型パラメーターにつながります :-)
更新 2: CLR と C# がこれを許可する必要があると主張しているわけではありません。何がそれにつながったのかを理解しようとしているだけです。
java - Generics : リストはリストと同じです?
extends
Java Generics のキーワードを理解しようとしています。
List<? extends Animal>
IS Aに任意のオブジェクトを詰め込むことができることを意味しList
ます Animal
次に、次も同じことを意味しません。
誰かが上記の2つの違いを知るのを手伝ってもらえますか? extends
ここでは冗長に聞こえます。
ありがとう!
c# - C# 4 の共分散はジェネリックのネストをサポートしていますか?
以下の「x」が変換される理由がわかりませんが、「y」と「z」は変換されません。
新しい共分散機能は単にジェネリックのジェネリックでは機能しないのですか、それとも何か間違っていますか? (y と z を機能させるために .Cast<> を使用することは避けたいと思います。)
c# - インターフェイスで反変性を実装することはできませんか?
私は反変性を理解し始めたところですが、代わりにインターフェイスを使用できる場合の利点を理解しようとしています。明らかに私は何かが欠けています。
これがc#4の例です
c# の以前のバージョンで動作する同じ例
これらは最良の例ではないかもしれませんが、それでも「理解」できないようです。アクションデリゲートで定義されたキーワークは、ラムダがデリゲートにあるような簡単な構文の方法ですか?
c# - C# の共変インターフェイスと反変インターフェイスについて
私は C# で読んでいる教科書でこれらに出くわしましたが、おそらくコンテキストが不足しているため、理解するのが困難です。
それらが何であり、何に役立つかについての簡潔な説明はありますか?
明確にするために編集:
共変インターフェース:
反変インターフェース:
c# - C#4.0での共変性と反変性の推論
C#4.0でインターフェイスを定義する場合、各ジェネリックパラメーターをin
またはとしてマークすることができますout
。ジェネリックパラメーターをoutとして設定しようとして問題が発生した場合、コンパイラーはエラーを発生させ、それを許可しません。
質問:
covariance
コンパイラに(out
)とcontravariance
( )の両方の有効な使用法を推測する方法がある場合in
、なぜインターフェイスをそのようにマークする必要があるのでしょうか。いつものようにインターフェイスを定義するだけで十分ではないでしょうか。クライアントコードでインターフェイスを使用しようとしたときに、安全でない方法で使用しようとするとエラーが発生します。
例:
また、
同じ状況でJavaが行うことではありませんか?私が覚えていることから、あなたはただのようなことをします
それとも私は物事を混ぜていますか?
ありがとう
.net - .NET 4.0 一般的な不変、共変、反変
私が直面しているシナリオは次のとおりです。
UserDataAccessLayer を一般的な基本型にキャストしようとするとITableDataAccessLayer<TableRecord>
、コンパイラは型を暗黙的に変換できないと不平を言います。
in
ジェネリック パラメーターのインターフェイス宣言でorキーワードを使用しようとすると、コンパイラは無効な差異out
について不平を言います: 型パラメーターは不変的に有効である必要があります。
次の抽象クラスがあります。
具体的な実装例は次のとおりです。
新しい UserDataAccessLayer() を返します。コンパイラが不平を言っているところです。
c#-4.0 - 共変と反変の両方の型、つまり、サブ型とスーパー型で完全に代替可能/変更可能な型を持つことはできますか?
共変でも反変でもよい型 (今のところセマンティクスは忘れています) を使用できますか?
例えば:
C# 4.0 の分散の本質については、Eric Lippert のブログを参照してください。
とにかく試してみましたが、それが許可されていないだけでなく、要点全体が欠けていることがわかりました。読み取り専用、書き込み専用、バリアンスの間のリンクを理解する必要があります。
もっと読むべきことがあると思います。
しかし、それまでの間、ひらめきを誘発する短い答えは大歓迎です。
c# - C#では、イベントハンドラの引数は反変ですか?
FrobbingEventArgs などでイベントを発生させるクラスがある場合、EventArgs を受け取るメソッドでそれを処理することはできますか?
ここにいくつかのコードがあります:
私が尋ねる理由は、ReSharper が XAML の同等のもの (のように見える) に問題があるように見えるためです。それは ReSharper のバグなのか、それとも私の C# の理解の誤りなのか疑問に思っています。
.net - インターフェイスのジェネリック型パラメーターの差異を検出する
インターフェイスを反映して、ジェネリック型パラメーターと戻り値の型の差異を検出する方法はありますか? つまり、リフレクションを使用して 2 つのインターフェイスを区別できますか。
両方の IL は同じに見えます。