問題タブ [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.
scala - 反変性の例
反変性が役立つ理由を説明するために、次の例を考えています。
Widgets
、Events
、およびを使用した GUI フレームワークを考えてみましょうEvent Listeners
。
Widgets
次のメソッドを定義します。
これらのメソッドは、「特定の」イベント リスナーのみを受け入れますが、これは問題ありません。ただし、すべてのイベントをリッスンする「キッチンシンク」リスナーも定義し、そのようなリスナーを上記の「リスナーの追加」メソッドに渡したいと思います。
たとえば、LogEventListener
すべての着信イベントをログに記録するように定義したいと思います
トレイトEventListener
は反変であるため、型の安全性を失うことなく、これらすべての「リスナーの追加」メソッドにEvent
渡すことができます。LogEventListener
それは理にかなっていますか?
c# - C# で共分散/反分散を機能させることができない
「ConsoleApplication4.E」と「ConsoleApplication4.C」の間に暗黙的な変換がないため、条件式のタイプを判別できません
これで「理由」はわかりましたが(と思います)、これをコンパイルする方法がわかりません。何らかの分散を定義し、それを継承するインターフェイスを作成する必要があると思いますが、よくわかりません。しかし、とにかく、E()
から継承する必要がありC()
ます。
テイカーはいますか?
ティア
.net - キャスト例外を伴うC#.NET4.0ジェネリック共分散問題
私はしばらくこれと戦ってきましたので、助けていただければ幸いです。これが私がC#.NET4.0で直面しているシナリオです。
両方のインターフェイスを実装するオブジェクトがあります。コードは正常にコンパイルされます。しかし、実行時に、このオブジェクトを次のようにキャストできます。
しかし、これとしてではありません:
これは非常に紛らわしいです、私は私が間違っていることをよくわかりません。誰かが私を正しい方向に向けてください。ありがとう!
c# - 不変の継承問題
「アカウント」に「利益」を適用できるようにするための戦略パターンを実装しようとしています。以下のコードでは、インターフェースの実装を辞書に追加することはできません。ある種の反変性の問題だと思いますが、これができるはずだと感じています:
編集:
答えはそれが不可能であるように思われるので、私がここで目指していることを達成する方法について何か提案はありますか?
c# - ジェネリック インターフェイス制約を使用する場合の共分散/反分散の難問
上記のコードを考えると、コンパイラは型MyFoo
をに割り当てる方法を判断できません。これはIFoo<IShape, Base>
おそらく、U
より少ない派生を受け入れることができることを意味する out として設定されているためです。ただし、Derived
は、まあ、 よりも派生しBase
ているため、コンパイラ エラーが発生します。
この例は不自然ですが、扱っている実装はMyFoo
ファクトリから返されるものです。
はU
パラメーターとして使用されますが、ジェネリック インターフェイスに割り当てようとしたときの出力でもありますが、out
ここではキーワードを使用できません。どうすればこれを回避できますか?
c# - 共変性を考慮してUnityに実装を解決させる
ハンドラーがコンテナーを介して登録される多態的なイベントの集約/処理にUnityを使用したいと思います。
ハンドラーは、入力パラメーターとしてのみ使用されるため、「in」修飾子を使用してジェネリックパラメーターを宣言します。したがって、パラメーターは反変です。
次のサンプルを検討します。
私の期待は次のとおりです。
- を受け取ったら、、、に
MsgA
ディスパッチする必要がMsgAHandler
ありMsgHandler
ますObjectHandler
。 - を受け取ったら
IMsg
、とに発送する必要がMsgHandler
ありObjectHandler
ます。 ObjectHandler
すべてのメッセージを受信する必要があります。
デフォルトでは、Castle Windsorは、特定の構成なしでこのシナリオを正しく処理します(v2.5.1でテスト済み)。
Unityは、解像度を向上させ、Resolve<IHandle<MsgA>>()
実装している任意のタイプに一致させる方法を公開していますIHandle<IMsg>
かIHandle<object>
?
UnityExtensions(ルールやポリシーのマッチングなど)を使用してサンプルを探しましたが、成功しませんでした。
誰かがそのようなシナリオを実装するために使用する正しいメカニズムに私を導くことができますか?
c# - メソッドパラメーターで使用される反変パラメーターに関する質問
共分散と反共分散を紹介する良い記事を読みました
http://bartdesmet.net/blogs/bart/archive/2009/04/15/14377.aspx
反変パラメーターは、入力位置 (メソッド パラメーター、セットのみのプロパティ、またはインデクサー) でのみ発生する必要があります。
反変性の理解に基づいて、上記のようにコードを配置しました。明らかに、線 A は正しくなく、反変性の概念を誤解しています。
どの部分が間違っていますか?正しく理解されていない概念は何ですか? それを正しくする方法は?
c# - 実世界の配列共分散問題
クラス DataTableColumn の配列を作成しようとしていますが、残念ながら私はそれに夢中になっています。今ではそれは私が何の成功もなしにやろうとしたことです
私の配列は次のようにする必要があります
実際にそのように働いている
ダイナミックを使用することは、それを行うための最良の方法ではないと思います..誰かが光を当ててください!
編集
くそー、エラーを忘れた
タイプ DataTableColumn< int >' を 'IDataTableColumn< object >' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)
型 DataTableColumn< System.DateTime を暗黙的に変換できませんか? >' を 'IDataTableColumn< オブジェクト >' に変更します。明示的な変換が存在します (キャストがありませんか?)
c# - IComparer および IEqualityComparer インターフェイスでの反変性の利点
反変性に関するmsdnページで、「IComparerでの反変性の利点」を示す非常に興味深い例を見つけました
まず、かなり奇妙な基本クラスと派生クラスを使用します。
私はすでに、その悪い例は、クラスが少なくとも独自のものを少し追加せずに基本クラスを継承することは決してないと言うことができます.
次に、単純な IEqualityComparer クラスを作成します。
次に、問題の例が続きます。
今私の質問 - まず第一に、この場合 Employee は不要なクラスです。実際には単なる人物クラスであるため、この状況で PersonComparer を使用できるのは事実です!
ただし、現実の世界Employee
では、少なくとも 1 つの新しいフィールドがありますJobTitle
。異なる従業員が必要な場合、比較のためにその JobTitle フィールドを考慮する必要があることは明らかであり、人の比較者などの反変比較者はその仕事に適していないことは明らかであるため、新しいメンバーを知ることができないためです。従業員が定義しました。
もちろん、非常に奇妙な機能であっても、状況によっては非論理的であっても、どの言語機能でも使用できますが、この場合、デフォルトの動作であるほど頻繁には役に立たないと思います。実際、型の安全性を少し壊しているように見えます。メソッドが Employee 比較子を期待している場合、実際には人またはオブジェクト比較子を入れることができ、問題なくコンパイルされます。デフォルトのシナリオが Employee をオブジェクトまたは基本的な Person のように扱うことになるとは想像しがたいですが。
それで、それらのインターフェースのデフォルトの反変性は本当に良いのでしょうか?
編集:反分散と共分散とは何かを理解しています。これらの比較インターフェースがデフォルトで反変になるように変更された理由を尋ねています。