問題タブ [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.
c# - T を Enum に制約するジェネリック メソッドを作成する
Enum.Parse
という概念を拡張する機能を構築しています
- Enum 値が見つからない場合にデフォルト値を解析できるようにします
- 大文字と小文字を区別しない
だから私は次のように書いた:
エラー Constraint cannot be special class が発生していますSystem.Enum
。
十分に公平ですが、ジェネリック列挙型を許可する回避策はありますか、それともParse
関数を模倣して型を属性として渡す必要がありますか?これにより、醜いボクシング要件がコードに強制されます。
編集以下のすべての提案は大歓迎です、ありがとう。
解決しました(大文字と小文字を区別しないようにループを残しました-XMLを解析するときにこれを使用しています)
編集: (2015 年 2 月 16 日) Christopher Currens は、以下の MSIL または F# でコンパイラを強制するタイプ セーフなジェネリック ソリューションを投稿しました。解決策がページのさらに上にある場合は、この編集を削除します。
編集2:(2021年4月13日)C#7.3以降、これに対処し、サポートされているため、受け入れられた回答を変更しましたが、上位の回答を完全に熟読することは、学術的および歴史的関心のために価値があります:)
c# - 値型制約のある一般的な宣言型間でコピーする方法
値型間で値をコピーするジェネリックメソッドがあります。次のアプローチでは、構造体の制約がある場合でも、設計時のエラーが発生します。値の間でコピーまたはキャストする方法はありますか?
c# - C#にパラメーター制約のあるジェネリックコンストラクターはありますか?
C#では、次のようなジェネリックメソッドに制約を課すことができます。
これを指定するT
場合、パラメーターを必要としないコンストラクターが必要です。「パラメーターを持つコンストラクターが存在するfloat[,]
」のような制約を追加する方法があるかどうか疑問に思っています。
次のコードはコンパイルされません。
回避策も役立ちますか?
c# - ジェネリック制約: 型に静的関数とパラメーターを持つコンストラクターを強制する
私はあなたが書くことができることを知っています:
T
空のコンストラクターを持つことを強制します。
私のQは:
/li>T
特定のタイプのパラメーターを持つコンストラクターを持つことを強制できますか? お気に入り:ジェネリッククラス内でこの関数を使用できるよう
T
に、静的関数(たとえば、 )を強制できますか?void F()
お気に入り :インターフェイスを実装するように指定できることは知って
T
いますが、私はそれを望んでいません。T
静的機能があることを指定したい。
.net - 一般的な制約の列挙
Enums (Enumerations) の拡張メソッドを構築しました - 、名前を付けて、言うGetEnumSecondName
これで、列挙型を取り、その型のすべての 2 番目の名前を返すジェネリック メソッドができました。
それを行うための回避策はありますか?
編集:
私が理解したように (Jon Skeet のおかげで)、C# は薄い種類の制約をサポートしていません。「通常の」VB.NETもそれをサポートしていないことを確認するVB.NETの専門家がいる場合。ありがとう。
generics - F#:一見動的な型を作成するのに役立つメンバー制約
F# メソッドにダック タイピングを追加する方法を検討しています。
入ってくるパラメーターに Test メソッドがある場所。私はこのような表記を見てきました:
クラス/インターフェースレベルではなく、メソッドレベルでジェネリック制約を使用できるように思えます。問題は、型の問題によりコンパイルできないことです。これは、メソッド レベルで制約を指定する方法がないと私に信じさせます。それは正確ですか?
c# - このC#ジェネリッククラスを理解するための助けが必要
私はNhibernate3.0を学んでいます。サンプルコード例の1つでは、抽象基本エンティティクラスを作成します。
次に、Customer
エンティティをEntity
基本クラスから継承させます。
私はそれが抽象ジェネリッククラスであることを理解しています、そしてそれはタイプが でwhere
あることを確認するためにキーワードを使用しています、これは私が混乱するところです。T
Entity<T>
Customer
「」から継承しますがEntity<Customer>
、この「Entity<Customer>
」は「Customer
」をとして取りますT
が、これCustomer
は「」ではありませんEntity<T>
。
これを理解するのを手伝ってください、私はこのジェネリッククラスに本当に混乱しています。
c# - C#ジェネリック制約のワイルドカード
C#には汎用ワイルドカードがなく、汎用メソッドでも同様の効果が得られることは承知していますが、フィールドでワイルドカードを使用する必要があり、それをエンコードする方法があるかどうかを判断できません。
もちろん、追加されるオブジェクトはタイプではなく、タイプState<Thing>
であるため、これは機能しませんState<T> where T : Thing
。リストの最も内部的なタイプを、? extends Thing
単なるJavaではなくJavaと同等になるように調整することは可能Thing
ですか?
c# - 一般的な制約 -- どちらかまたは両方のケースでこの状況を修正する方法がわかりません
基本的に私は以下を持っています:
問題は、制約が異なっていても、同じ署名を持つメンバーを持つことができないため、これを行うことができないことです。ただし、制約がIComparable
ORのいずれかであると述べる方法はありませんIComparable<T>
。ですから、1つを選んでそれを使う以外に、ここで何をすべきかわかりません. そして、どちらを選んだとしても、それらは別のものであり、互いに継承していないため、もう一方を失うことになります (これは理にかなっています)。
両方を使用して達成する方法があるという点で、ここで何かが欠けていますか、それともどちらかを選択する必要がありますか (おそらく汎用バージョン)?