Kekangan Generik: Membezakan Antara Nilai dan Jenis Rujukan
Pengenalan
Dalam pengaturcaraan generik, kekangan membolehkan kami menentukan sekatan pada parameter jenis. Satu isu biasa ialah membezakan antara jenis nilai (cth., integer) dan jenis rujukan (cth., rentetan). Soalan ini meneroka kes di mana kekangan pada parameter jenis tidak dapat diselesaikan seperti yang dijangkakan.
Masalahnya
Pengarang mengemukakan cabaran untuk membezakan antara senario jenis nilai yang berbeza: biasa jenis nilai (int), jenis nilai nullable (int?), dan jenis rujukan (rentetan). Pada mulanya, mereka mencadangkan menggunakan where T : struct untuk mengenal pasti jenis struct (jenis nilai) dan di mana T : kelas untuk mengenal pasti jenis rujukan, tetapi ia mengakibatkan ralat penyusunan disebabkan oleh definisi ahli pendua.
The Penyelesaian
Pandangan utama ialah kekangan bukan sebahagian daripada tandatangan kaedah dan resolusi beban lampau mempertimbangkan jenis parameter. Jadi, penulis meletakkan kekangan dalam parameter untuk membezakan antara nilai dan jenis rujukan. Berikut ialah kod yang disemak:
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
Dengan menggunakan kelas pembantu ini, kod kini membezakan dengan betul antara senario jenis nilai yang berbeza. Foo(z) akan menyusun dan dipetakan kepada kaedah (3), kerana rentetan ialah jenis rujukan.
Atas ialah kandungan terperinci Bagaimanakah Kekangan Generik Boleh Membezakan Secara Berkesan Antara Nilai dan Jenis Rujukan dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!