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

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

Linda Hamilton
リリース: 2025-01-02 17:13:39
オリジナル
688 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート