問題タブ [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.
c# - C#4.0の差異は、アップキャストを使用して基本クラスのコンストラクターを呼び出すのに役立ちますか?
私は一般的な分散について少し読んでいて、それを完全には理解していませんが、それが次のようなことを可能にするかどうか知りたいですか?
c# - List(of List(of MyType))をIEnumerable(of IEnumerable(of MyType))にキャストする
タイプの引数を受け入れるメソッドがありますIEnumerable(Of IEnumerable(Of MyType))
私が次のことをした場合:
できます。
合格するList(Of List(Of MyType))
と、コンパイルされますが、次のように実行時エラーが発生します。
合格するMyType()()
と、次のようにコンパイル時エラーが発生します。
現在、.net3.5を使用しています。
これは、.net4で解決されたと聞いたList<MyObject>をIEnumerable<MyInterface>にキャストするのと同様の問題のようです。
このエラーを回避するためのアイデアはありますか?
c# - 型パラメーターにキャストする必要があり、制約された型を使用できないのはなぜですか?
T にキャストする必要がある理由と、Add2 が Bar をパラメーターとして受け入れない理由を誰か説明できますか?
scala - 型の下限によって分散位置が変わるのはなぜですか?
Scala言語仕様(分散注釈に関するセクション4.5、p。44)は言う
- 型パラメーターの分散位置は、それを囲む型パラメーター句の分散位置の反対です。
- 型宣言または型パラメーターの下限の分散位置は、型宣言または型パラメーターの分散位置の反対です。
上記の最初のポイントを使用すると、(少なくとも形式的には) 簡単にわかります。
エラーメッセージを生成します
1 番目と 2 番目のポイントを使用すると、簡単に確認できます。
エラーメッセージを生成します
前述したように、これらのエラーが発生する理由を形式的に (つまり、分散注釈の規則に従って) 確認するのは簡単です。ただし、これらの制限の必要性を示す例を思いつくことはできません。対照的に、メソッド パラメータが分散位置を変更する必要がある理由を説明する例を考え出すのは非常に簡単です。たとえば、分散注釈のチェックを参照してください。
そこで、私の質問は次のとおりです。上記の 2 つのコードが許可されたと仮定すると、発生する問題の例は何ですか? つまり、上記の 2 つのルールが使用されなかった場合に何が問題になるかを示す、これと同様の例を探しています。型の下限に関する例に特に興味があります。
Scala の型の境界と分散に対する回答では、この特定の質問が未解決のままであることに注意してください。一方、 「下限」で与えられた回答は、型の分散を逆にしますが、なぜでしょうか? 私には間違っているようです。
編集:最初のケースは次のように処理できると思います(上記の例を適応させます)。以下が許可されたとします。
次に、実装できます
そしてそれを次のように使用します
これは明らかに面倒です。ただし、「反変型パラメーター + 型下限」の組み合わせにも問題があることを示すために、これを適応させる方法がわかりませんか?
scala - 1 つのメソッドの結果を別のメソッドのパラメーターとして再び使用できるようにするジェネリック型付け
オブジェクトを初期化し、そのオブジェクトを再度使用して追加の操作を行う Factory に要約するコードがあります。
私がこれを理解しているように、 の結果は、 に関係なく、常に任意の 1 つのインスタンスにinitialize
渡すのに適している必要があります。finish
Factory
T
ファクトリ自体は、何が何であるかわからない時点で呼び出されますT
。
バリアント (2) は機能しますが、バリアント (1) は機能しません。
しかし、これを修正する方法がわかりません。それは可能ですか?
コンパイラは、wrapper
それ自体を理解できないメソッドを呼び出すことによって何を得ますか? 私の観点からobj
する_$6
と、コンパイラはそのキャプチャに_
. まったく新しいメソッドを導入することなく、コンパイラにそれを認識させるにはどうすればよいですか?
c# - C# がバリアント ジェネリック クラスをサポートしないのはなぜですか?
次の小さな LINQPad の例を見てください。
次のエラーでコンパイルに失敗します。
差異修飾子が無効です。バリアントとして指定できるのは、インターフェイスおよびデリゲート型パラメーターのみです。
コードに論理的な問題は見られません。すべてを静的に検証できます。これが許可されないのはなぜですか?言語に矛盾が生じるのでしょうか、それとも CLR の制限のために実装するにはコストがかかりすぎると考えられたのでしょうか? 後者の場合、開発者として、上記の制限について何を知っておく必要がありますか?
インターフェイスがそれをサポートしていることを考えると、クラスのサポートが論理的にそれに続くと予想していました。