問題タブ [covariance]
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# - LINQ to SQL Covariance - これは正しい方法ですか?
いくつかのデータベース (Elephants、Giraffes、Gorillas など) があり、それぞれに ElephantInputs、ElephantResults、GiraffeInputs、GiraffeResults、GorillaInputs、GorillaResults という名前の入力テーブルと結果テーブルがあります。テーブルの命名を制御できません。
LINQ to SQL を使用して、ElephantInputs、ElephantResults、GiraffeInputs、GiraffeResults などのクラスを自動的に生成しています。
これらのデータベースから入力を読み取って処理できる単一のクラス、Processor() を作成したいと考えています。ユーザーの選択に基づいて Processor をインスタンス化する Factory メソッドがあります。
最初に、Input オブジェクトと Result オブジェクトのインターフェイスを作成し、各データベースの部分クラスを作成して、その入力オブジェクトと結果オブジェクトがそのインターフェイスを実装するようにしました。これにより、各動物に共通のインターフェースが得られました。また、データベースからアイテムを返すためのいくつかのメソッドを持つ各データベースのリポジトリ クラスも作成しました。
次に、プロセッサ用のインターフェイスを作成しました
具体的なプロセッサと、それを作成するファクトリがあります。
最後に、プロセッサを呼び出すプログラムは次のとおりです。
私はこれを正しく行っていますか?もう少し複雑な方法はありますか?ありがとう
.net - IDictionary.NET 4では共変ではありません
IDictionary<TKey, TValue>
.NET 4 / Silverlight 4 では共分散がサポートされていません。
s で今できることと類似していIEnumerable<T>
ます。
おそらくKeyValuePair<TKey, TValue>
共変ではないことにも要約されます。少なくとも値については、辞書で共分散を許可する必要があると思います。
それで、それはバグですか、それとも機能ですか?おそらく .NET 37.4 で実現するのでしょうか?
更新(2年後):
IReadOnlyDictionary<TKey, TValue>
.NET 4.5 には がありますが、共変にはなりません。:·/
これは から派生したものであり、インターフェイスではないため、IEnumerable<KeyValuePair<TKey, TValue>>
共KeyValuePair<TKey, TValue>
変にはなりません。
BCL チームは、代わりにいくつかを使用するために、多くを再設計する必要がありますICovariantPair<TKey, TValue>
。また、厳密に型指定されたインデクサーthis[TKey key]
などは、共変インターフェイスでは使用できません。GetValue<>(this IReadOnlyDictionary<TKey, TValue> self, TKey key)
同様の目的は、実際の実装を内部的に呼び出さなければならない拡張メソッドをどこかに配置することによってのみ達成できます。これは、間違いなく非常に面倒なアプローチのように見えます。
c# - Funcをキャストするより速い方法Funcへ?
にキャストするより速い方法はありますFun<TEntity, TId>
かFunc<TEntity, object>
上記の例のように、返されたラムダにリフレクションコードを含まずにに変換する方法はありtypedGetPropertyFn
ますか?Func<TEntity, object>
編集:変更されたソリューションを追加
以下の最終的な解決策に含めた正しい道に私を導いてくれた280Z28に感謝します。式をサポートしていないプラットフォーム用のリフレクションコードをそこに残しました。それを行うプラットフォームの場合、取得とプロパティのパフォーマンスが26倍から27倍(平均13 / .5ティック)増加します。int
string
c# - 共分散と逆分散の違い
共変性と反変性の違いを理解するのに苦労しています。
java - ジェネリック関数はJavaでどのように実装されていますか?
私の理解によると、Javaの次の汎用関数:
次の形式にコンパイルされます (無制限であるため)。
ただし、次のステートメントを実行すると、コンパイラは戻り値が整数型であると判断できます。コンパイラはどのようにそれを理解しますか?
上記のステートメントが機能するためには、関数を次のように記述すべきではありませんか?
c# - C# 共分散の問題
次のように、適切なインターフェイスにキャストする linq-to-sql で生成されたドメイン エンティティがありました。
ただし、部分クラスに触れずにlinq-to-sqlテーブルの名前を変更しましたが、コードはまだコンパイルされています。
リストには適切な量の要素が含まれていましたが、それらはすべて null でした。
これが機能することを確認するためにヘルパー メソッドを記述する必要がありますか、または .net 3.5 でこれを行うためのコンパイル時に安全な簡単な組み込みの方法がありますか?
.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# - .NET 4.0 の共変性と反変性のバグ
C# 4.0 の共変性と反変性のサポートによる奇妙な動作:
での結果ですArgumentException: Delegates must be of the same type.
奇妙ですね。Delegate.Combine()
(デリゲートで操作を実行するときに呼び出される+=
) が実行時に共変性と反変性をサポートしないのはなぜですか?
さらに、BCL のデリゲート型には、そのジェネリックパラメーターSystem.EventHandler<TEventArgs>
に反変の注釈がないことがわかりました。TEventArgs
なんで?これは完全に合法で、TEventArgs
入力位置でのみ使用される型です。Delegate.Combine()
?でバグをうまく隠しているため、反変の注釈がない可能性があります。;)
ps これはすべて、VS2010 RC 以降のバージョンに影響します。
c# - 共分散、反分散、デリゲート問題
私は再びあなたの助けが必要です。今回は、共分散、反分散、デリゲート、そして爆発する単純なアイデアに苦労しています...
リフレクションを操作し、属性を読み取り、プロパティ値の検証を実行できるように、デリゲートとそのパラメーターに必要なパラメーターを受け取る businessobject-properties の属性を実装したいと考えています。
この背後にある理由は、DataBinding で Windows.Forms を使用しており、DataBinding 更新メソッドを OnPropertyChanged に設定して、GUI で適切に機能する更新を取得する必要があるためです。ただし、ユーザーが実際にオブジェクトを保存できるかどうかを確認するために、コントロールの検証イベントに反応してプロパティを正しく検証する方法が必要です。ただし、コントロールの Validating-Event は、プロパティに値を書き込んだ後にのみ発生します。プロパティのセッターで検証を行うとクラッシュが発生し、検証をもう一度実装しない限り (またはセッターから呼び出されるメソッドに抽出しない限り)、ユーザーに正確な情報を提供できませんでした。
これを最もエレガントでクリーンに保つために、次のいずれかがあればいいと思いました。
そうすれば、すべてのプロパティに対してリフレクションを介して反復し、必要なすべての検証を実行し、正しいメソッドで PropertyValidator-Attribute を設定できます。しかし、私はアイデアを少し試してみましたが、とにかくこれを機能させることはできません。これが私が持っているものです。これを達成する方法についてのアイデアがあるかもしれません.
どんなヒントでも歓迎...
c# - 委任共分散の混乱の難問!
これが機能しないのはなぜですか?デリゲートの共分散を正しく理解していませんか?