汎用制約: 値型と参照型の区別
はじめに
汎用プログラミングでは、制約を使用すると、型パラメータに制限を指定できます。よくある問題の 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 サイトの他の関連記事を参照してください。