問題タブ [generic-constraints]

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

delphi - Delphi XE:ハックに辞任することなく、クラスタイプに制約のある汎用型のパラメーターを使用して仮想コンストラクターを呼び出すことはできますか?

複合コントロールの汎用の祖先を構築しようとしています。最初のアイデアは次のようになりました。

すでにご存知かもしれませんが、これによりコンパイラエラーE2568がトリガーされます。型パラメータ宣言にCONSTRUCTOR制約がないと新しいインスタンスを作成できません。ただし、制約を追加してconstructorも、パラメーターのないコンストラクターを意味するため、役に立ちません。

テンプレートをキャストしTControlてコードをコンパイル可能にします。

...ただし、実行時にアクセス違反が発生します。

おそらく機能するハックの1つは、RTTIを介してコンストラクターを呼び出すことですが、それはかなり汚い解決策だと思います。

基本的に機能するもう1つのハックは、クラス型変数を中間体として使用することです。

よりクリーンな解決策はありますか?また、typeパラメーターで仮想コンストラクターを直接呼び出すのにclasstype-constraintでは不十分な理由を誰かが説明できますか?

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

c# - C# ジェネリックとジェネリック制約

クラス B で派生させる予定の型パラメーター T を持つジェネリック抽象クラス A を作成しています。

A には、ジェネリック関数を持つクラス C のインスタンスであるデータ メンバー mX があります。この汎用関数 GetAllOfType() には、1 つの型パラメーター T があります。この型パラメーターは、3 番目のクラス D に制約されます。GetAllOfType() は、D の派生クラスのインスタンスを含む D のインスタンスのコンテナーを検索し、タイプ T のサブセット (したがって、D への制約)。

クラス D 自体には特定のデータ メンバー int mY はありませんが、E や F など、D の一部の派生クラスにはあります。

だからここで私の問題が始まります:

クラス B がクラス A を継承して実装するために使用するパラメーターの型は、D の派生クラスです。GetAllOfType() を介して列挙し、型 E、F、またはその他のメンバー mY にアクセスする関数 Foo をクラス A に記述しようとしています。 mY を持つメンバー。

ただし、問題は GetAllOfType() が制約されていることであり、クラス A も制約していないというエラーが発生します。

私はそのように A を制約しようとしました:

しかし、次の行に沿ってコンパイル時エラーが発生しています。

mY T' does not contain a definition for' と入力し、拡張メソッドmY' of typeT' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

また、複数の派生クラスに制約しようとしました:

しかし、次の行に沿ってエラーも発生しています。

クラス型制約 'F' は、他の制約より前にリストする必要があります。型制約を制約リストの先頭に移動することを検討してください

私はそれらを切り替えてみました:

同様に、結果は同じエラーになりますが、F が E に置き換わっています。

私が試みていることは可能ですか?私は何を間違っていますか?

繰り返しますが、クラス C、D、E、および F については何も変更できません。

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

c# - クラスシグニチャにおけるジェネリック制約の推論

C#のジェネリック制約を使用する際の特定の要件に不満があり、問題を回避する方法があるかどうかを知りたいです。そうでない場合は、物事が私が望むように機能しない理由について説明したいと思います。

この例は、私が現在基本的にしなければならないことを示しています。

提案Aは、私が希望するものが利用可能であることを示しています(そして、それがこのように機能しなかった理由はわかりません):

提案Bは、提案Aほど魅力的ではありませんが、別の可能な代替案を示しています。

どちらの提案も、派生型を作成するときに指定する必要のある型パラメーターの数を最小限に抑え、提案Aは、冗長な制約の束の必要性を排除します。

では、C#がこれらの提案の1つをサポートできなかった/提供できなかった理由はありますか?(または、偶然に、言語の関連する既存の機能を見落としたことがありますか?)

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

c# - C# - 継承による "where" 制限の変更

さまざまな実装をサポートするはずの汎用データ アクセス レイヤーがあるとします。これを実現するためIPeristenceServiceに、永続層内のデータにアクセスするためのすべてのメソッドを定義する基本インターフェースがあります。インターフェイスは次のようになります。

したがって、永続化サービスは、インターフェースによってのみ定義されるオブジェクトのインスタンスを作成することはできません。そのため、メソッドの実装を制限することは適切な決定GetDataです。

このインターフェイスを実装している開発者は、インターフェイス ポインターを返そうとするとコードをコンパイルできないため、これは非常に簡単です。永続化レイヤー内のデータは、インターフェイスではなく、実装されたオブジェクトで表す必要があります!

ここで、エンティティによって表されるリレーショナル データベース内のデータを永続化する永続化サービスを作成しているとします。すべてのエンティティは、1 つの基本インターフェイスから継承しています: IEntity. 永続化サービスはエンティティのみを永続化できるため、非エンティティ オブジェクトの受け渡しは失敗する必要があります。したがって、渡されたオブジェクト インスタンスが から継承されているかどうかを検証する必要がありますIEntity。where 表記を使用すると、コンパイル時にこれが可能になりますが、次のようなインターフェイスを実装するだけです。

動作しませんよね?

私がやろうとしていることを理解する方法はありますか?

前もって感謝します :-)

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

c# - 制約としての C# の無制限のジェネリック型

無制限のジェネリック型であるジェネリック制約を持つことは可能ですか?

例えば:


編集:コンテキストを説明するために、メソッドの使用を IDictionary に制限したいのですが、メソッド自体については、TKey と TValue が正確に何であるかは問題ではありません。

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

c# - タイプパラメータに2つのnew()制約を追加するにはどうすればよいですか?

私はこのようなものが欲しい:

そして、TFromとTToの両方が基本タイプから派生していることを強制したいと思います。

そして、このメソッドをTFrom型の拡張メソッドとして作りたいと思います。

出来ますか ?そして、正しい構文は何ですか?

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

c# - ジェネリック型制約で指定された型を返すことができないのに、同じ型を制約なしで返すことができるのはなぜですか?

私はこれを持っています:

しかし、これらのことはうまくいきます:

  1. 戻り値の型が とにかく であるにもかかわらず、2 番目のコード ブロックがコンパイルされないのはなぜIClubですか? それは不公平ではありませんか?

  2. 上記のコードで型制約の可能性を十分に活用していないことはわかっていますが、コードを実行するための代替手段は何ですか?

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

c# - 型推論はクラスのスコープで推論しますが、メソッドは推論しませんが、それらはまったく同じですか?

わかりました、タイトルをひどく間違えたに違いありません。より多くのコード、より少ない言葉:

コンパイラは満足していDoます。T型を簡単に推測できます。今私がこれを持っているとしましょう:

コンパイラは、型を明示的に型付けする必要があります。これが私が思うことです:

最初のクラスでは、オーバーロードがあり、クラス全体で知られているメソッドTから簡単に推測できました。大したことではありません。しかし、2 番目のケースでは、メソッドの一般的な制約として指定されているため、推測するのが難しい場合があります。Ok。IsVisibleTTManagerT

しかし、これもうまくいきません:

  1. T最後のケースでコンパイラが推論しないのはなぜですか?

  2. さらに重要なことに、最後のケースは最初のケースとどのように違うのでしょうか? 最初のケースでは、コンパイラはメソッドからそれを推測し、最後にメソッドですぐに利用できるように、を含むクラスにIsVisible何があるかを確認する必要があります。したがって、3 番目のケースは最初のケースよりも簡単だと思います。TIsVisibleIsVisible

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

c# - 単純型と文字列の制約

制約を課したいジェネリックメソッドがあります。

制約はすべて単純な型int、boolなどですが、文字列も許可する必要があります。このグループを制約する方法はありますか?

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

c# - なぜNullableなのかジェネリック制約の参照型として一致しません

重複の可能性:
ジェネリックパラメーターとしてnull許容型は可能ですか?

ジェネリック型の制約がある非常に奇妙なことに遭遇しました。私はこのようなクラスを持っています:

ただし、期待どおりにnull許容型を使用できないことがわかりました。

int?参照型でなければならないエラーが発生します。Nullableは、実際には、参照型のように見えるようにするためのシンタックスシュガーを使用した構造体ですか?