問題タブ [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.

0 投票する
1 に答える
203 参照

c# - C# 共分散の問題

次のように、適切なインターフェイスにキャストする linq-to-sql で生成されたドメイン エンティティがありました。

ただし、部分クラスに触れずにlinq-to-sqlテーブルの名前を変更しましたが、コードはまだコンパイルされています。

リストには適切な量の要素が含まれていましたが、それらはすべて null でした。

これが機能することを確認するためにヘルパー メソッドを記述する必要がありますか、または .net 3.5 でこれを行うためのコンパイル時に安全な簡単な組み込みの方法がありますか?

0 投票する
3 に答える
3313 参照

.net-4.0 - C# 4.0 のジェネリック バリアンス

C# 4.0 の Generic Variance は、例外なく次のように記述できるように実装されています (これは C# 3.0 で発生することです)。

[機能しない例: Jon Skeet の回答を参照]

私は最近、Jon Skeet が Generic Variance の優れた概要を説明した会議に出席しましたが、完全に理解できているかどうかはわかりません.contra と co-variance に関してはinoutキーワードの重要性を理解していますが、私は舞台裏で何が起こっているのか興味があります。

このコードが実行されると、CLR は何を認識しますか? を暗黙的に変換するのList<int>か、List<object>それとも派生型から親型に変換できるようになったのか、それとも単に組み込まれているだけなのか?

興味深いことに、これが以前のバージョンで導入されなかったのはなぜですか?主な利点は何ですか?つまり、実際の使用法ですか?

Generic Variance のこの投稿に関する詳細情報(ただし、質問は非常に時代遅れであり、実際の最新の情報を探しています)

0 投票する
4 に答える
1749 参照

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 以降のバージョンに影響します。

0 投票する
1 に答える
365 参照

c# - 共分散、反分散、デリゲート問題

私は再びあなたの助けが必要です。今回は、共分散、反分散、デリゲート、そして爆発する単純なアイデアに苦労しています...

リフレクションを操作し、属性を読み取り、プロパティ値の検証を実行できるように、デリゲートとそのパラメーターに必要なパラメーターを受け取る businessobject-properties の属性を実装したいと考えています。

この背後にある理由は、DataBinding で Windows.Forms を使用しており、DataBinding 更新メソッドを OnPropertyChanged に設定して、GUI で適切に機能する更新を取得する必要があるためです。ただし、ユーザーが実際にオブジェクトを保存できるかどうかを確認するために、コントロールの検証イベントに反応してプロパティを正しく検証する方法が必要です。ただし、コントロールの Validating-Event は、プロパティに値を書き込んだ後にのみ発生します。プロパティのセッターで検証を行うとクラッシュが発生し、検証をもう一度実装しない限り (またはセッターから呼び出されるメソッドに抽出しない限り)、ユーザーに正確な情報を提供できませんでした。

これを最もエレガントでクリーンに保つために、次のいずれかがあればいいと思いました。

そうすれば、すべてのプロパティに対してリフレクションを介して反復し、必要なすべての検証を実行し、正しいメソッドで PropertyValidator-Attribute を設定できます。しかし、私はアイデアを少し試してみましたが、とにかくこれを機能させることはできません。これが私が持っているものです。これを達成する方法についてのアイデアがあるかもしれません.

どんなヒントでも歓迎...

0 投票する
6 に答える
1217 参照

c# - 委任共分散の混乱の難問!

これが機能しないのはなぜですか?デリゲートの共分散を正しく理解していませんか?

0 投票する
13 に答える
5904 参照

java - リストができない理由を説明する簡単な方法動物 = 新しい ArrayList()?

私はなぜそれをしてはいけないのかを知っています。しかし、なぜこれが不可能なのかを素人に説明する方法はありますか。これは素人にも簡単に説明できますAnimal animal = new Dog();。犬は動物の一種ですが、犬のリストは動物のリストではありません。

0 投票する
3 に答える
1098 参照

c# - 反変性とEntity Framework 4.0:EntityCollectionをIEnumerableとして指定する方法は?

Entity Framework 4 を使用してエンティティとして実装するいくつかのインターフェイスを指定しました。

上記から次のコンパイラ エラーが表示されます。

「Demo.ConcreteContainer」はインターフェイス メンバー「Demo.IContainer.Children」を実装していません。「Demo.ConcreteContainer.Children」は「Demo.IContainer.Children」を実装できません。「System.Collections.Generic.IEnumerable」の一致する戻り値の型がないためです。

私の現在の理解では、これはIEnumerable(EntityCollectionによって実装されています)が共変ですが、おそらく反変ではないためです。

この型パラメーターは共変です。つまり、指定した型またはより派生した型のいずれかを使用できます。共分散と反分散の詳細については、ジェネリックにおける共分散と反分散を参照してください。

私は正しいですか、もしそうなら、IContainer具象クラスを使用するのではなく、純粋に他のインターフェースに関してインターフェースを指定するという私の目標を達成する方法はありますか?

それとも、もっと根本的なことを誤解していますか?

0 投票する
4 に答える
537 参照

c# - Generics と Linq をより有効に活用して、パラメータ化された型のリストをインスタンス化する

1 つ以上のハッシュ アルゴリズムを使用してファイルをハッシュしています。必要なハッシュ タイプをパラメータ化しようとすると、思っていたよりもかなり複雑になりました。

ジェネリックや LINQ をより有効に活用するチャンスを逃していると思います。また、Type[] をより具体的な型のセット (HashAlgorithm の子孫) に制限するのではなく、パラメーターとして使用する必要があることも好きではありません。型をパラメーターとして指定し、このメソッドに構築していますが、HashAlgorithm の呼び出し元の新しいインスタンスを渡すと、これは見栄えが良くなるでしょうか?

0 投票する
3 に答える
9766 参照

c++ - C++:キャストせずに継承されたクラスで「無効な共変の戻り値の型」を回避するにはどうすればよいですか?

クラスが相互に依存する非常に複雑なクラス階層があります。それぞれ C と A のインスタンスを返すメソッドを含む 2 つの抽象クラス A と C があります。継承されたクラスでは、共変型を使用したいと考えています。この場合、継承関係を前方宣言する方法がわからないため、これが問題になります。

"test.cpp:22: error: invalid covariant return type for 'virtual D* B::outC()'" エラーが発生します。これは、コンパイラが D が C のサブクラスであることを認識していないためです。

B::outC() の戻り値の型を C* に変更すると、例がコンパイルされます。継承されたクラスで B* と D* を戻り値の型として保持する方法はありますか (方法があることは直感的にわかります)。

0 投票する
4 に答える
581 参照

generics - IEnumerable を受け取る関数はなぜIEnumerable を受け入れない?

たとえば、次のクラスがあるとします。

次に、次のコードを使用したいと思います。

しかし、これはエラーを生成します:

どうしてこれなの?MyFoo は IMyBar を実装しているため、MyFoo の IEnumerable を IMyBar の IEnumerable として扱うことができると考えられます。ありふれた現実世界の例として、車のリストを作成した後、それは車のリストではないと言われたことがあります。

それはほんの些細な迷惑ですが、誰かがこれに光を当てることができれば、私は大いに義務付けられます.