問題タブ [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での共変性と反変性を理解する
チャンネル9でそれについてのビデオを見ましたが、あまり理解していませんでした。
誰かが私にこれらについて理解しやすい簡単な例を教えてもらえますか?その後、実際にどのように使用されるのでしょうか?
java - コンパイラまたはタイプチェッカー(javac)でスタックオーバーフローを引き起こすJavaスニペット?
昨日のセミナーで、プレゼンター(Peter Sestoft)は、共分散と逆分散の両方を特徴とする3つのクラスを持つ小さなJavaプログラムを示しました。javacを使用してコンパイルしようとすると、タイプチェッカーはStackOverflowExceptionをスローします。
このスニペットは、Microsoftで働いている何人かの人によって開発されています(1人はケネディと呼ばれていたと思います)。
Googleを使用してそれを見つけることができません。コードスニペットを知っている人はいますか?ここに貼り付けて(最大10行のコード)、誰でも見ることができますか?:)
とても楽しかったです...
c# - C# 3 でのインターフェイス継承 (co(ntra)-variance?) によるジェネリック型推論
次の 2 つのジェネリック型があります。
ここで、これらのインターフェイスのコレクションの拡張メソッドを定義したいと思います。これらはどちらも、IRange<T>
またはその子孫であるためIRange<T>
、両方を処理する 1 つのメソッドを定義できることを望んでいました。このメソッドは、2 つの違いを処理する必要はなく、 からの共通部分のみを処理する必要があることに注意してくださいIRange<T>
。
したがって、私の質問は次のとおりです。
IEnumerable<T>
これら 2 つのタイプのいずれかのコレクション ( ) を処理する拡張メソッドを 1 つ定義できますか?
私はこれを試しました:
IEnumerable<IRange<Int32, String>>
ただし、次のように を渡します。
次のコンパイラ エラーが表示されます。
エラー 1 'System.Collections.Generic.IEnumerable>' には 'Slice' の定義が含まれておらず、タイプ 'System.Collections.Generic.IEnumerable>' の最初の引数を受け入れる拡張メソッド 'Slice' が見つかりませんでした ( using ディレクティブまたはアセンブリ参照がありませんか?) C:\Dev\VS.NET\LVK\LVK.UnitTests\Core\Collections\RangeTests.cs 455 26 LVK.UnitTests
注:コンパイルできるとは思っていませんでした。co(ntra)-variance (どちらがどちらの方向であるかを知る必要がある日) について十分に理解していて、それがうまくいかないことを知っています。私の質問は、Slice 宣言を機能させるために何かできることがあるかどうかです。
わかりましたので、範囲インターフェイスの型を推測しようとしIEnumerable<R>
ましR
たIRange<T>
。
だから私はこれを試しました:
これは私に同じ問題を与えます。
それで、これを微調整する方法はありますか?
そうでない場合、私の唯一のオプションは次のとおりです。
- 2 つの拡張メソッドを定義し、おそらくコレクションの 1 つを基本インターフェイスを含むコレクションに変換することによって、内部メソッドを内部的に呼び出しますか?
- C# 4.0 を待ちますか?
2 つのメソッドを定義する方法を以下に示します (注: まだ設計の初期段階にあるため、まったく機能しない可能性があります)。
これが私の問題を示すサンプルプログラムコードです。
Main メソッドで呼び出しを Slice1 から Slice2 に変更すると、両方の使用法でコンパイラ エラーが発生することに注意してください。
c# - 共変性の説明
まず、SOやブログで共変性と反変性について多くの説明を読みました。共変性と反変性に関するこのような素晴らしいシリーズを作成してくれたEricLippertに大いに感謝します。
しかし、私は少し頭を動かそうとしているというより具体的な質問があります。
エリックの説明によると、共変性と反変性はどちらも変換を表す形容詞であると私が理解している限りです。共変変換は型の順序を保持する変換であり、反変変換はそれを逆にする変換です。
私は、ほとんどの開発者が直感的に理解できるような方法で共分散を理解しています。
ここでの戻り操作は、両方の動物が哺乳類またはキリンよりもまだ大きいサイズを維持しているため、共変です。その点で、ほとんどの戻り演算は共変であり、反変演算は意味がありません。
もちろん、このコードはほとんどの開発者にとって意味がありません。
私の混乱は、共変性の引数パラメーターにあります。あなたが次のような方法を持っていた場合
私は常に、入力パラメーターが常に反変の振る舞いを強制することを学びました。タイプが入力パラメーターとして使用される場合、その動作は反変である必要があります。
ただし、次のコードの違いは何ですか
あなたがこのようなことをすることができないのと同じトークンであなたはすることができません
私が求めているのは、メソッド引数が反変変換を通過させる理由だと思います。
長い投稿でごめんなさい、多分私はこれを間違って理解しています。
編集:
以下のいくつかの会話によると、たとえばデリゲートレイヤーを使用すると、明らかに共変性を示すことができることを理解しています。次の例を考えてみましょう
もちろん、これは違法です。なぜなら、誰かが任意の動物をsomeActionに渡すことができるのに対し、ProcessMammalは、哺乳類またはより具体的なもの(哺乳類よりも小さい)を期待しているからです。これが、someActionがActionまたはより具体的なもののみである必要がある理由です(アクション)
ただし、これは中央にデリゲートのレイヤーを導入しています。反変の投影が発生するためには、中央にデリゲートが存在する必要がありますか?また、Processをインターフェイスとして定義する場合、引数パラメーターを反変型として宣言するのは、上記で示したデリゲートを誰かに実行させたくないからです。
c# - 共分散と逆分散の違い
共変性と反変性の違いを理解するのに苦労しています。
.net-4.0 - C# 4.0 のジェネリック バリアンス
C# 4.0 の Generic Variance は、例外なく次のように記述できるように実装されています (これは C# 3.0 で発生することです)。
[機能しない例: Jon Skeet の回答を参照]
私は最近、Jon Skeet が Generic Variance の優れた概要を説明した会議に出席しましたが、完全に理解できているかどうかはわかりません.contra と co-variance に関してはin
とout
キーワードの重要性を理解していますが、私は舞台裏で何が起こっているのか興味があります。
このコードが実行されると、CLR は何を認識しますか? を暗黙的に変換するのList<int>
か、List<object>
それとも派生型から親型に変換できるようになったのか、それとも単に組み込まれているだけなのか?
興味深いことに、これが以前のバージョンで導入されなかったのはなぜですか?主な利点は何ですか?つまり、実際の使用法ですか?
Generic Variance のこの投稿に関する詳細情報(ただし、質問は非常に時代遅れであり、実際の最新の情報を探しています)
c# - 共分散、反分散、デリゲート問題
私は再びあなたの助けが必要です。今回は、共分散、反分散、デリゲート、そして爆発する単純なアイデアに苦労しています...
リフレクションを操作し、属性を読み取り、プロパティ値の検証を実行できるように、デリゲートとそのパラメーターに必要なパラメーターを受け取る businessobject-properties の属性を実装したいと考えています。
この背後にある理由は、DataBinding で Windows.Forms を使用しており、DataBinding 更新メソッドを OnPropertyChanged に設定して、GUI で適切に機能する更新を取得する必要があるためです。ただし、ユーザーが実際にオブジェクトを保存できるかどうかを確認するために、コントロールの検証イベントに反応してプロパティを正しく検証する方法が必要です。ただし、コントロールの Validating-Event は、プロパティに値を書き込んだ後にのみ発生します。プロパティのセッターで検証を行うとクラッシュが発生し、検証をもう一度実装しない限り (またはセッターから呼び出されるメソッドに抽出しない限り)、ユーザーに正確な情報を提供できませんでした。
これを最もエレガントでクリーンに保つために、次のいずれかがあればいいと思いました。
そうすれば、すべてのプロパティに対してリフレクションを介して反復し、必要なすべての検証を実行し、正しいメソッドで PropertyValidator-Attribute を設定できます。しかし、私はアイデアを少し試してみましたが、とにかくこれを機能させることはできません。これが私が持っているものです。これを達成する方法についてのアイデアがあるかもしれません.
どんなヒントでも歓迎...
c# - Generics と Linq をより有効に活用して、パラメータ化された型のリストをインスタンス化する
1 つ以上のハッシュ アルゴリズムを使用してファイルをハッシュしています。必要なハッシュ タイプをパラメータ化しようとすると、思っていたよりもかなり複雑になりました。
ジェネリックや LINQ をより有効に活用するチャンスを逃していると思います。また、Type[] をより具体的な型のセット (HashAlgorithm の子孫) に制限するのではなく、パラメーターとして使用する必要があることも好きではありません。型をパラメーターとして指定し、このメソッドに構築していますが、HashAlgorithm の呼び出し元の新しいインスタンスを渡すと、これは見栄えが良くなるでしょうか?
java - Java でのオーバーロードとオーバーライドの両方の場合に共変性と反変性を示す関数の例を教えてください。
Java における共分散と反分散の良い例を示してください。
c# - インターフェイスのメソッドを実装する際に、「共分散」と「反分散」の概念が適用されるのはなぜですか?
ユースケースは次のようなものです:
ここで私の質問は、Funda の Covariance と Contravariance を考慮すると、Clone() メソッドの戻り値の型として "SomeClass(As it is distributed from object)" を使用できないのはなぜですか?
このマイクロソフトの実装の背後にある理由を誰か説明してもらえますか????