問題タブ [generic-variance]

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 投票する
2 に答える
36636 参照

c# - C# 4.0 ではジェネリック共分散と反分散はどのように実装されていますか?

私は PDC 2008 には参加しませんでしたが、C# 4.0 がジェネリック共分散と反分散をサポートすると発表されたというニュースを耳にしました。つまり、List<string>に割り当てることができますList<object>。それはどうしてですか?

Jon Skeet の著書C# in Depthでは、C# ジェネリックが共分散と反分散をサポートしない理由が説明されています。主に安全なコードを書くためのものです。現在、C# 4.0 はそれらをサポートするように変更されました。それは混乱をもたらすでしょうか?

C# 4.0 の詳細を知っている人はいますか?

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 投票する
2 に答える
424 参照

c# - クラス階層性問題(ジェネリックの分散を伴う!)

問題:

返されたものが読み取り専用であると仮定するとIList、私が達成しようとしていることは安全であることがわかります(またはそうではありませんか?)。私がしようとしていることを達成する方法はありますか?TasksChainエラーが発生しやすく、コードの重複につながるため、アルゴリズムを自分で実装しようとはしません(もう一度!)。たぶん、抽象的なチェーンを定義して、そこから両方TasksChainを実装することができますStatesChainか?または多分Chain<T>クラスを実装しますか?

この状況にどのようにアプローチしますか?

詳細:ITaskインターフェース を定義しました:

およびIStateから継承するインターフェイスITask

IHasTasksListインターフェイスも定義しました。

IHasStatesList

ここで、を定義しましたTasksChain。これは、一連のタスクを操作するコードロジックを持つクラスです(TasksChainそれ自体が一種のITask!であることに注意してください)。

私はState次の方法を実装しています:

ご覧のとおり、これは明示的なインターフェイス実装を利用して「非表示」FailureTaskにし、代わりにFailureStateプロパティを表示します。

問題は、とのStatesChain両方を継承する(および、明示的なインターフェイスとして実装されたとを実装する)も定義したいという事実に起因します。また、を非表示にして、を表示するだけにします。(「問題」のセクションに含まれているのは、実際にはこの後のはずですが、最初に置く方がはるかに読みやすいと思いました)。IStateIHasStateListITaskIHasTaskListIHasTaskListTasksIHasStateListStates

(pff..long text)ありがとう!

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

c# - C#の内部でのデリゲートの質問

SOで次の質問を読んだ後、デリゲートの分散を掘り下げていました:Delegate.CreateDelegate()とジェネリックス:ターゲットメソッドへのバインドエラー

https://www.blogger.com/comment.g?blogID=8184237816669520763&postID=2109708553230166434でBarrykellyから非常に優れたコードを見つけました 。

ここにあります(砂糖漬けの形で:-)

この1行(非常に単純に見える)を除いて、すべてを理解しています。

b = a.Invoke; //分散を使用してデリゲートを割り当てる簡単な方法ですが、間接参照のレイヤーを追加します

誰か教えてもらえますか:

  1. 静的関数に必要なパラメータを渡さずにinvokeを呼び出すことができる方法。
  2. invokeの呼び出しからの戻り値を割り当てるときに内部で何が起こっているか
  3. バリーは余分な間接参照とはどういう意味ですか(彼のコメントで)
0 投票する
1 に答える
1530 参照

c#-4.0 - レイジーの使用に関する問題ジェネリック抽象クラス内から

すべてのDAOクラスが派生するジェネリッククラスがあります。これは以下で定義されています。すべてのエンティティの基本クラスもありますが、それは一般的ではありません。

外部キーの関係を満たすために主キーを取得しようとしているため、メソッドGetIdOrSaveは定義した方法とは異なるタイプになりますSabaAbstractDAO。したがって、この関数は、主キーを取得するか、エンティティを保存してから主キーを取得するために使用されます。鍵。

最後のコードスニペットには、一般的な部分を取り除いた場合の動作に関する解決策があるため、分散を使用することでこれを解決できると思いますが、コンパイルするインターフェイスの記述方法がわかりません。

コンパイルしようとすると、このエラーが発生します。

私はそれをこのように呼ぼうとしています:

定義をこれに変更すると、機能します。

それで、分散(必要な場合)とジェネリックを使用してこれをコンパイルするにはどうすればよいですか?それで、とでのみ機能する非常に一般的なメソッドを持つことができBaseModelますAbstractDAO<BaseModel>か?メソッドとおそらく抽象クラス定義を変更するだけでよいと思います。使用法は問題ないはずです。

更新: 非常に役立つ応答で、少し改善された例がありますが、興味深いジレンマがあります:

私はこれを今定義しました、そして私は矛盾するエラーを得るのでここにまたはinT持っていません、もしそうなら私はそれがそうであるに違いないと思います、そしてそれで私はそれを不変にしました、それはVS2010が理解できないように見えるからですそれを出します。outout Tcontravariantly validin Tcovariantly valid

コンパイルはしましたが、このエラーが発生します。

上記の2つのコードスニペットを修正しましたが、ここで期待したように分散が機能しないようです。

私はこれを試しました:

しかし、私はインターフェースと同じ問題を抱えています、それを置くoutと不平を言うので、私inは反対の不満を置きます。

これが合法であれば、これを機能させることができると思います。

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

scala - 型パラメータの分散を決定する方法は?

Scala の共変性と反変性の実世界の例に触発されて、より良い質問は次のようになると思いました。

ライブラリを設計するときに、型パラメーターを共変にするか反変にするかを決定する際に自問すべき特定の質問のセットはありますか? それとも、すべてを不変にしてから、必要に応じて変更する必要がありますか?

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

c# - Autofac のコンポーネント解像度のカスタマイズ / 一般的な共変/反変の問題

まず、あいまいな質問タイトルで申し訳ありません。より正確なものを思いつくことができませんでした。

これらのタイプを考えると:

Dispatch任意のコマンドを受け入れて適切な .xml ファイルに送信するメソッドを作成したいと思いますICommandHandler<>。DI コンテナー (Autofac) を使用すると、コマンドの型からコマンド ハンドラーへのマッピングが大幅に簡素化される可能性があると考えました。

DI コンテナーが上記のすべての型を認識しているとします。今私は呼んでいます:

実際には、これは Autofac が をスローする結果になりComponentNotRegisteredExceptionますICommandHandler<SpecialFooCommand>

SpecialFooCommandただし、理想的には、使用可能な最も近いコマンド ハンドラーによってa が処理されるようにしたいと考えています。FooCommandHandler上記の例のa によって。

おそらくカスタム登録ソースを使用して、Autofacをその目的に合わせてカスタマイズできますか?


PS: (次の例のように) 共分散/反分散が邪魔になるという根本的な問題がある可能性があること、および唯一の解決策はジェネリックをまったく使用しないことである可能性があることを理解しています...しかし、私はそうします可能であれば、ジェネリック型に固執したい。

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

c++ - C ++のジェネリックJAVA? 実行する方法?

私のコードの問題は何ですか..出力は次のとおりです...

1>Linking...
1>TemplateStuding1.obj : エラー LNK2001: 未解決の外部シンボル "class X __cdecl doIt(class X)" (??$doIt@VXClass@@@@YA?AVXClass@@V0@@Z)
1 >D:\Programming\cpp\cpp-how-to-program\CppHowToProgram\Release\Test.exe: 致命的なエラー LNK1120: 1 つの未解決の外部

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

c# - IList の不変性をキャストできる理由あちらへ?

現在、同僚向けに C# の新しいジェネリック バリアンス機能のプレゼンテーションを準備しています。話を短くするために、次の行を書きました。

はい、これはもちろん不可能です。 IList(Of T) は不変です (少なくとも私の考えでは)。コンパイラは次のように教えてくれます。

System.Collections.Generic.IList<System.Windows.Forms.Form>タイプを に 暗黙的に変換することはできません System.Collections.Generic.IList<System.Windows.Forms.Control>。明示的な変換が存在します (キャストがありませんか?)

うーん、これは明示的な変換を強制できるということですか? 私はちょうどそれを試しました:

そして…コンパイル!不変性を捨てることができるということですか?- 少なくともコンパイラは問題ありませんが、以前のコンパイル時エラーを実行時エラーに変更しました:

Unable to cast object of type 'System.Collections.Generic.List`1[System.Windows.Forms.Form]' to type 'System.Collections.Generic.IList`1[System.Windows.Forms.Control]'.

私の質問: の不変性IList<T>(または私の実験に関する他の不変のインターフェイス) を捨てることができるのはなぜですか? 私は本当に不変性を捨てるのですか、それともここでどのような種類の変換が行われますか (IList(Of Form)IList(Of Control)は完全に無関係です)? これは私が知らなかった C# の暗いコーナーですか?

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

c# - 複数のジェネリックスのあいまいさ

以下のコードは、1つがC#で、もう1つがVB.Netであることを除いて、まったく同じです。C#は問題なくコンパイルされますが、VB.Netは警告をスローします。

インターフェイス'System.IObserver(Of Foo)'は、'インターフェイスIObserver(Of In T)'の'In'および'Out'パラメータのため、別の実装されたインターフェイス'System.IObserver(Of Bar)'とあいまいです。

VB.NetがC#ではなく警告を表示するのはなぜですか?そして最も重要なのは、どうすればこの問題を解決できますか?

Obs:Visual Studio2010Ultimateで.NetFramework4を使用しています。

VB.Netコード:

C#コード: