問題タブ [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 に答える
277 参照

generics - .NET 4のインターフェイスベースタイプで共分散を使用しますか?

LINQ-to-SQLで作成されたエンティティがいくつかあります。これらのエンティティのうち6つ(主にドロップダウンリストで値を表す)は、私が呼び出したインターフェイスを実装していますIValue。これを行ったのは、UIレイヤーがいくつかの特殊なケース、特に、レコードの元の値に削除済みのフラグが設定されている場合に何を表示するかを考慮する必要があるためです。

リポジトリには、ListAllXXXこれらの人のためのさまざまな方法があります。これらはすべて、適切なエンティティタイプに入力されたジェネリックリストを返します。例:

ContactTypeIValueもちろん、実装します。

UI固有のリストを実際に取得するように設計された別のサービスセットがあります。したがって、基本的なパターンは次のとおりです。

DummyValue(これは私が作成した単純なクラスであり、も実装していることに注意してください。このクラスIValueの全体的な目的は、「新規追加」および「削除」メニューオプションとして機能することです。)

これはすべて、ほぼ同一のコードを数十行書きたくなかったために発生しました。これは、共分散があると思った理由です。

ここに書かれているコードはコンパイルされません。私はラインList<IValue>上で手動キャストを試しました。ListAllContactTypesこれはコンパイルされますが、実行時に無効なキャスト例外で失敗します。

ここに行きたい場所に行くにはどうすればよいですか?インターフェイスで一般的な差異を使用することに制限はありますか?もしそうなら、それを回避する簡単な方法はありますか?そうでない場合、私は非常に反復的であるがわずかに異なるコードの束を書くことに追いやられていますか?(私が本当に避けようとしていることです。)

これは重複している可能性がありますが、私のGoogle-fuは現在私を失敗させています。もしそうなら、それに応じて閉じるために投票してください。(もしそうなら、私は投票を重ねます!)

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

c# - C# 4.0 のジェネリック共分散に関する質問

このインターフェースを定義した後:

次のコードが機能する理由:

そしてこれはしませんか?:

int が値型であることと何か関係がありますか? はいの場合、どうすればこの状況を回避できますか?

ありがとう

0 投票する
2 に答える
726 参照

c# - C#4.0での共変性と反変性の推論

C#4.0でインターフェイスを定義する場合、各ジェネリックパラメーターをinまたはとしてマークすることができますout。ジェネリックパラメーターをoutとして設定しようとして問題が発生した場合、コンパイラーはエラーを発生させ、それを許可しません。

質問:

covarianceコンパイラに(out)とcontravariance( )の両方の有効な使用法を推測する方法がある場合in、なぜインターフェイスをそのようにマークする必要があるのでしょうか。いつものようにインターフェイスを定義するだけで十分ではないでしょうか。クライアントコードでインターフェイスを使用しようとしたときに、安全でない方法で使用しようとするとエラーが発生します。

例:

また、

同じ状況でJa​​vaが行うことではありませんか?私が覚えていることから、あなたはただのようなことをします

それとも私は物事を混ぜていますか?

ありがとう

0 投票する
2 に答える
2318 参照

.net - .NET 4.0 一般的な不変、共変、反変

私が直面しているシナリオは次のとおりです。

UserDataAccessLayer を一般的な基本型にキャストしようとするとITableDataAccessLayer<TableRecord>、コンパイラは型を暗黙的に変換できないと不平を言います。

inジェネリック パラメーターのインターフェイス宣言でorキーワードを使用しようとすると、コンパイラは無効な差異outについて不平を言います: 型パラメーターは不変的に有効である必要があります。

次の抽象クラスがあります。

具体的な実装例は次のとおりです。

新しい UserDataAccessLayer() を返します。コンパイラが不平を言っているところです。

0 投票する
2 に答える
1753 参照

c# - これはC#4の共分散バグですか?

次のコードでは、がに暗黙的に変換可能であるため、からelementsに暗黙的にキャストできると期待していました。baseElementsTBaseIBase

ただし、コメントに記載されているエラーが発生します。

仕様からの引用:

バリアントタイプパラメータで宣言されたインターフェイスまたはデリゲートタイプの場合、タイプT<A1, …, An>は分散変換可能であり、バリアントタイプパラメータごとに次のいずれかが当てはまります。T<B1, …, Bn>TT<X1, …, Xn>Xi

  • Xiは共変であり、からへの暗黙の参照またはID変換が存在AiしますBi

  • Xiは反変であり、からへの暗黙の参照またはID変換が存在BiしますAi

  • Xiは不変であり、ID変換はからに存在AiしますBi

私のコードを確認すると、仕様と一致しているようです。

  • IEnumerable<out T>インターフェイスタイプです

  • IEnumerable<out T>バリアント型パラメーターで宣言されます

  • T共変です

  • TBaseからへの暗黙の参照変換が存在しますIBase

それで-それはC#4コンパイラのバグですか?

0 投票する
2 に答える
145 参照

c# - この架空の状況で、C#<4でジェネリック共分散を回避するエンドランを実行することは可能ですか?

動物の小さな継承階層があるとします。

次に、にstrings変換する方法を提供するインターフェースを次に示しますIAnimals

そして最後に、これを行うための1つの戦略があります。

さて、質問です。このプログラムが正しくコンパイルおよび実行されるように、[1]、[2]、および[3]とマークされたセクションを置き換えることは可能ですか?[1]、[2]、[3]以外の部分に触れずにそれを行うことができない場合でも、IAnimalの任意の実装を含むコレクション内のIAnimalの各インスタンスから取得できますか?Transmogrifierそもそもそのようなコレクションを作ることさえできますか?

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

vb.net - プロパティをオーバーライドして、VB.NETで派生型を返すことは可能ですか?

注文システムを表す次のクラスについて考えてみます。

ここで、OrderBaseの集約的な性質を維持しながら、これらのクラスをより具体的な注文クラスのセットに拡張したいとします。

WebOrderクラスのOverridenプロパティにより、戻りタイプがOrderBaseで定義されたものとは異なることを示すエラーが発生します...ただし、戻りタイプはOrderBaseで定義されたタイプのサブクラスです。なぜVBはこれを許可しないのですか?

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

c#-4.0 - 共変と反変の両方の型、つまり、サブ型とスーパー型で完全に代替可能/変更可能な型を持つことはできますか?

共変でも反変でもよい型 (今のところセマンティクスは忘れています) を使用できますか?

例えば:

C# 4.0 の分散の本質については、Eric Lippert のブログを参照してください。


とにかく試してみましたが、それが許可されていないだけでなく、要点全体が欠けていることがわかりました。読み取り専用、書き込み専用、バリアンスの間のリンクを理解する必要があります。

もっと読むべきことがあると思います。

しかし、それまでの間、ひらめきを誘発する短い答えは大歓迎です。

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

c# - C# コンパイラが、クラスがインターフェイスを実装していることを認識できない

次のコードはコンパイルに失敗し (VS2010 を使用)、理由がわかりません。List<TestClass>コンパイラは、それが と「互換性がある」(より適切な言葉がなくて申し訳ありません) と推測できるはずですIEnumerable<ITest>が、どういうわけかそうではありません。ここで何が欠けていますか?



コンパイラは次の 2 つのエラーを返します。

  1. 'ConsoleApplication1.Program.Test(System.Collections.Generic.IEnumerable<ConsoleApplication2.ITest>)' に最も一致するオーバーロードされたメソッドには、無効な引数が含まれています

  2. 引数 1: 'System.Collections.Generic.List<ConsoleApplication2.TestClass>' から 'System.Collections.Generic.IEnumerable<ConsoleApplication2.ITest>' に変換できません

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

.net - インターフェイスのジェネリック型パラメーターの差異を検出する

インターフェイスを反映して、ジェネリック型パラメーターと戻り値の型の差異を検出する方法はありますか? つまり、リフレクションを使用して 2 つのインターフェイスを区別できますか。

両方の IL は同じに見えます。