値と参照型を区別するための汎用制約
C# では、汎用制約を使用して型パラメーターに制限を適用できます。ただし、値の型、null 許容値の型、および参照型を区別しようとする場合、型パラメーター宣言で制約を使用するだけでは不十分な場合があります。
型パラメーター宣言外の制約
代わりに、より効果的なアプローチは、パラメータ宣言内に制約を配置することです。これは型破りに見えるかもしれませんが、制約に基づいてオーバーロードを解決できます。次のコードを考えてみましょう:
class RequireStruct<T> where T : struct { } class RequireClass<T> where T : class { } static void Foo<T>(T a, RequireStruct<T> ignore = null) where T : struct { } // Value type static void Foo<T>(T? a) where T : struct { } // Nullable value type static void Foo<T>(T a, RequireClass<T> ignore = null) where T : class { } // Reference type
このコードでは、パラメータ宣言内で制約が指定されています。値型 (int など) に対して Foo を呼び出す場合、最初と 2 番目の Foo メソッドは両方とも実行可能です。値型制約のあるメソッドが選択されるのは、null 非許容値型 (RequireStruct
使用例
int x = 1; int? y = 2; string z = "a"; Foo(x); // Value type Foo(y); // Nullable value type Foo(z); // Reference type
このアプローチにより、オーバーロードの解決中に、値の型、NULL 許容値の型、および参照型を効果的に区別できます。これは型破りに見えるかもしれませんが、ジェネリック メソッド宣言におけるこれらの異なる型を区別する問題に対する実用的な解決策を提供します。
以上がC# でジェネリック制約によって値の型、Null 許容値の型、および参照型を効果的に区別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。