ホームページ >バックエンド開発 >C++ >C# の汎用制約では、値の型、Null 許容値の型、および参照型をどのように区別できますか?

C# の汎用制約では、値の型、Null 許容値の型、および参照型をどのように区別できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-02 17:13:39739ブラウズ

How Can C# Generic Constraints Distinguish Between Value Types, Nullable Value Types, and Reference Types?

汎用制約: 値と参照の区別

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。