Apabila berurusan dengan jenis generik, membezakan antara jenis nilai, jenis nilai nullable dan jenis rujukan selalunya diperlukan. Pertimbangkan kod berikut:
static void Foo<T>(T a) where T : struct { } // 1 static void Foo<T>(T? a) where T : struct { } // 2
Kod ini berjaya mengendalikan jenis nilai (1) dan jenis nilai boleh batal (2). Walau bagaimanapun, percubaan untuk mengesan jenis rujukan (3) menggunakan kekangan berikut tidak menyusun:
static void Foo<T>(T a) where T : class { } // 3
Mesej ralat menunjukkan bahawa ahli dengan tandatangan yang sama sudah wujud. Isu ini timbul kerana kekangan bukan sebahagian daripada tandatangan, tetapi parameter adalah. Untuk menyelesaikannya, kita boleh meletakkan kekangan dalam parameter:
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
Pendekatan ini membolehkan kita membezakan antara tiga kes.
Atas ialah kandungan terperinci Bagaimanakah Kita Boleh Membezakan Jenis Nilai, Jenis Nilai Boleh Null dan Jenis Rujukan dalam Kekangan Generik C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!