問題タブ [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 投票する
2 に答える
192 参照

c#-3.0 - C#3.0 の Pub-/Sub-Scenarios で Co-/Contravariance をサポートする必要がありますか?

私のアプリケーションでは、サブスクライバーを登録するための何かを提供する単純なイベント ハブを作成しています。

そして出版イベント。

とてもシンプルです。Publish<int>(0)を実装しているすべてのサブスクライバーにルーティングしたいISubscriber<int>

それほど難しくないのは、サブスクライバーの EventType を反変にすることです。したがって、ISubscriber<object>基本的にすべてを消費する必要があります。値型も消費してほしいかどうかはわかりません。

C#4 では問題ありませんが、今は C#3 でこのようなことを行っており、インターフェイスで反変性を偽装しています。

さて、このように「イベント型」にデータを詰め込みたいと思います。そのイベントのジェネリック パラメーターは、共変でなければなりません。

パブリッシュするとPublish<DataChanged<B>>(new DataChanged<B>(new B())(指定された B : A)、Subscriber にはDataChanged<A>、データがどこに渡された B インスタンスであるかが通知されますDataChanged<B>。したがって、共分散のサポートも必要です。

次のように、Co-/And Contravariance の両方をサポートするライブラリを作成することを考えました。

次のような変換(キャストではありません!)が可能になります:

どう思いますか?出来ますか?動的プロキシを使用してそれを行うことを考えました。

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

c# - 異なる型パラメータ間の変換が許可されないのはなぜですか?

ある汎用コンテナを別のコンテナに変換すると非常に便利なので、わかりませんか?

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

c# - 継承でジェネリック クラスを作成する方法は?

次のコードを機能させるにはどうすればよいですか? C# のジェネリックをよく理解していないと思います。おそらく、誰かが私を正しい方向に向けることができます。

それはおそらく簡単な答えです。

更新: まず、これは C# 3.0 では不可能ですが、C# 4.0 では可能になります。

C# 3.0 で実行するには、これは 4.0 までの単なる回避策であり、次を使用します。

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

.net - .NET Framework 4.0 での型の相違

IEnumerable<T>IComparable<T>およびさらにいくつかがタイプバリアントになりました。IList<T>ICollection<T>および他の多くはそうではありません。なんで?

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

c# - ジェネリッククラスとインターフェースの非ジェネリックバージョン

ジェネリックインターフェイスまたはクラスを作成してから、このクラスまたはインターフェイスのさまざまなバージョンを非ジェネリックな方法で使用したいという状況に陥ることがよくあります。たとえば、私は次のようなインターフェースを持っているかもしれません:

これにより、クラスをそのタイプのファクトリにすることができます。次に、これらを一般的なファクトリクラスに登録したいので、次のように記述します。

辞書では、値にどのタイプを使用しますか?ある種の設計原理が欠けているかどうかはわかりませんが、これは共(ntra?)分散と多くの関係があることを認識しています。どんな助けやアイデアも大歓迎です。

0 投票する
15 に答える
58196 参照

c# - C#:リターンタイプのオーバーライド

C#でリターンタイプをオーバーライドする方法はありますか?もしそうなら、どのように、そしてそうでなければ、なぜそしてそれを行うための推奨される方法は何ですか?

私の場合は、抽象基本クラスとその子孫とのインターフェースがあります。私はこれをやりたいです(実際にはそうではありませんが、例として!):

RadioactivePooもちろん、から継承しPooます。

これが必要な理由は、Catオブジェクトを使用する人ExcrementがにキャストすることなくプロパティをPoo使用できるようにするRadioactivePooためです。たとえば、ユーザーが放射性のうんちを必ずしも認識または気にしないリストCatの一部である可能性があります。Animalそれが理にかなっていることを願っています...

私が見る限り、コンパイラは少なくともこれを許可していません。だから不可能だと思います。しかし、これに対する解決策として何をお勧めしますか?

0 投票する
5 に答える
7023 参照

c# - C#:分散(共分散/反分散)はポリモーフィズムの別の言葉ですか?

私は単語の正確な意味を理解しようとしており、CovarianceオンラインContravarianceのいくつかの記事と StackOverflow に関する質問から、理解できることから、それはポリモーフィズムの別の単語にすぎません。

上記のステートメントで正しいですか?それとも間違っていますか?

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

c++ - 共変仮想関数とスマートポインター

C ++では、戻り型が元の戻り型のサブクラスである限り、サブクラスは仮想関数をオーバーライドするときに別の戻り型を指定できます(両方ともポインター/参照として返されます)。

この機能をスマートポインターにも拡張することは可能ですか?(スマートポインタがいくつかのテンプレートクラスであると仮定します)

説明する:

編集:コンラッド・ルドルフが示唆したように、これは直接可能ではありません。しかし、私はこの方法に出くわしました:

このように行くことを提案しますか?