汎用制約: 値と参照の区別
C# では、汎用制約を使用して型パラメーターに特定の要件を強制できます。これは、値の型、Null 許容値の型、および参照型を区別する場合に特に便利です。
値型と Null 許容値型の制約
区別する次のコードを考えてみましょう。プレーンな値型と null 許容値の間type:
static void Foo<T>(T a) where T : struct { } // Plain value type (e.g. int) static void Foo<T>(T? a) where T : struct { } // Nullable value type (e.g. int?)
参照型の制約
ただし、 where T : class を使用して参照型の制約を定義しようとすると、コンパイラ エラーが発生します。これは、オーバーロードの解決中に制約が適用され、パラメータが制約よりも優先されるためです。
この問題を解決するには、あまり洗練されていない方法ではありますが、パラメータ内に制約を配置できます。
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 { } // Plain 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
オプションのパラメーター無視内に制約を配置することにより、コンパイラーはパラメーターの型と競合することなく、さまざまなケースを区別できます。これにより、参照型を正しい関数オーバーロードに意図的にマッピングできるようになります。
以上がC# の汎用制約では、値の型、Null 許容値の型、および参照型をどのように区別できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。