Kekangan Generik untuk Membezakan Nilai dan Jenis Rujukan
Dalam C#, kekangan generik boleh digunakan untuk menguatkuasakan sekatan pada parameter jenis. Walau bagaimanapun, apabila cuba membezakan antara jenis nilai, jenis nilai boleh batal dan jenis rujukan, menggunakan kekangan dalam pengisytiharan parameter jenis mungkin tidak mencukupi.
Kekangan Di Luar Pengisytiharan Parameter Jenis
Sebaliknya, pendekatan yang lebih berkesan ialah meletakkan kekangan dalam pengisytiharan parameter. Walaupun ini mungkin kelihatan tidak konvensional, ia membenarkan resolusi beban berlebihan berdasarkan kekangan. Pertimbangkan kod berikut:
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 { } // 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
Dalam kod ini, kekangan ditentukan dalam pengisytiharan parameter. Apabila memanggil Foo untuk jenis nilai (mis., int), kedua-dua kaedah Foo pertama dan kedua berdaya maju. Kaedah dengan kekangan jenis nilai dipilih kerana ia menentukan jenis nilai yang tidak boleh dibatalkan (RequireStruct
Contoh Penggunaan
int x = 1; int? y = 2; string z = "a"; Foo(x); // Value type Foo(y); // Nullable value type Foo(z); // Reference type
Pendekatan ini membolehkan anda membezakan antara jenis nilai, nullable jenis nilai, dan jenis rujukan dengan berkesan semasa resolusi beban lampau. Walaupun ia mungkin kelihatan tidak lazim, ia menyediakan penyelesaian praktikal kepada masalah membezakan antara jenis yang berbeza ini dalam pengisytiharan kaedah generik.
Atas ialah kandungan terperinci Bagaimanakah Kekangan Generik Dapat Membezakan Secara Berkesan Antara Jenis Nilai, Jenis Nilai Boleh Null dan Jenis Rujukan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!