ジェネリック型を扱う場合、多くの場合、値型、NULL 許容値型、および参照型を区別する必要があります。次のコードを考えてみましょう:
static void Foo<T>(T a) where T : struct { } // 1 static void Foo<T>(T? a) where T : struct { } // 2
このコードは、値の型 (1) と null 許容値の型 (2) を正常に処理します。ただし、次の制約を使用して参照型 (3) を検出しようとするとコンパイルされません:
static void Foo<T>(T a) where T : class { } // 3
エラー メッセージは、同じ署名を持つメンバーが既に存在することを示します。この問題は、制約は署名の一部ではなく、パラメータは署名の一部であるために発生します。これを解決するには、パラメーターに制約を配置します。
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 { } // 1 static void Foo<T>(T? a) where T : struct { } // 2 static void Foo<T>(T a, RequireClass<T> ignore = null) where T : class { } // 3
このアプローチにより、3 つのケースを区別することができます。
以上がC# の汎用制約で値の型、Null 許容値の型、および参照型を区別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。