[解決済み] ジェネリックメソッドを数値型に制限する制約がありますか?
質問
ジェネリックスを使用して、ジェネリック型の引数を制限する方法があるかどうか、どなたか教えてください。
T
だけにしてください。
-
Int16
-
Int32
-
Int64
-
UInt16
-
UInt32
-
UInt64
を意識しています。
where
キーワードのインターフェイスが見つかりません。
のみ
といった型があります。
みたいな感じ。
static bool IntegerFunction<T>(T value) where T : INumeric
解決方法は?
C#はサポートしていません。Hejlsbergは、この機能を実装しない理由を次のように説明しています。 ブルース・エッケルとのインタビューにて :
それに、複雑さを増すことが、得られる小さな収穫に見合うかどうかも明らかではありません。やりたいことが制約システムで直接サポートされていない場合は、ファクトリーパターンで実現することができます。例えば
Matrix<T>
例えば、その中でMatrix
であれば、内積のメソッドを定義したい。もちろん、それは最終的に2つのT
の場合は、少なくとも制約としてそれを言うことはできません。T
はint
,double
またはfloat
. しかし、あなたができることは、あなたのMatrix
を引数として取る。Calculator<T>
であり、かつCalculator<T>
というメソッドを持っています。multiply
. それを実装し、それをMatrix
.
しかし、これではかなり複雑なコードになってしまい、ユーザーは自分自身で
Calculator<T>
を実装し、それぞれの
T
を使用したい。拡張可能である必要がない限り、つまり、決まった数の型をサポートしたいだけであれば、例えば
int
と
double
であれば、比較的シンプルなインターフェースで済ませることができます。
var mat = new Matrix<int>(w, h);
しかし、ユーザーが独自のカスタムタイプを提供できるようにしたい場合は、すぐにこの実装をオープンにして、ユーザーが自分自身の
Calculator
のインスタンスを作成します。例えば、10進浮動小数点のカスタム実装を使用する行列をインスタンス化する場合。
DFP
というのは、このようなコードを書かなければならないからだ。
var mat = new Matrix<DFP>(DfpCalculator.Instance, w, h);
のすべてのメンバを実装します。
DfpCalculator : ICalculator<DFP>
.
もう一つの方法は、残念ながら同じ制限を共有していますが、ポリシー・クラスで作業することです。 Sergey Shandarの回答で説明されているように .
関連
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み] 2つのリストを結合する
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] リフレクションを使ってジェネリックメソッドを呼び出すにはどうしたらいいですか?
-
[解決済み] 汎用クラスやメソッドのメンバからTの型を取得する方法
-
[解決済み] メソッドの戻り値の型を汎用的にするにはどうすればよいですか?
-
[解決済み] C#でジェネリックメソッドからNULLを返すにはどうしたらいいですか?
-
[解決済み] なぜC#は汎用属性型を禁止しているのですか?
-
[解決済み] C#で演算子==はジェネリック型に適用できない?
-
[解決済み】TをEnumに拘束するGenericメソッドの作成
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】スクリプトクラスが見つからないので、スクリプトコンポーネントを追加できない?
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】WebForms UnobtrusiveValidationModeは、jqueryのScriptResourceMappingを必要とする
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】トランスポート接続からデータを読み取れない:既存の接続は、リモートホストによって強制的に閉じられました。
-
[解決済み】リソースの読み込みに失敗した:ステータス500(内部サーバーエラー)のサーバーの応答)
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] 関数を終了するには?