ホームページ > バックエンド開発 > C++ > C# でジェネリック制約によって値型と参照型を効果的に区別するにはどうすればよいですか?

C# でジェネリック制約によって値型と参照型を効果的に区別するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-30 19:00:16
オリジナル
937 人が閲覧しました

How Can Generic Constraints Effectively Differentiate Between Value and Reference Types in C#?

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

はじめに

汎用プログラミングでは、制約を使用すると、型パラメータに制限を指定できます。よくある問題の 1 つは、値の型 (整数など) と参照型 (文字列など) を区別することです。この質問では、型パラメーターの制約が期待どおりに解決されなかったケースを検討します。

問題

著者は、異なる値型のシナリオを区別するという課題を提起しました。値の型 (int)、null 許容値の型 (int?)、および参照型 (string)。当初、構造体の型 (値型) を識別するために where T : struct を使用し、参照型を識別するために 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 { } // 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
ログイン後にコピー

これらのヘルパー クラスを使用することにより、コードはさまざまな値の型のシナリオを正しく区別できるようになりました。 string は参照型であるため、Foo(z) はコンパイルされ、メソッド (3) にマップされます。

以上がC# でジェネリック制約によって値型と参照型を効果的に区別するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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