Були величезні суперечки щодо цього дивацтва, коли функція була спочатку розроблена ще в C # 2.0. Проблема в тому, що користувачі C # повністю звикли, що це має значення:
if(someReference == null)
Розширюючи рівність до типів значень, що допускають обнулення, у вас є наступний вибір.
Nullable рівність дійсно піднімається . Якщо один або обидва операнди є нульовими, то результат не є ні true, ні false, але null. У цьому випадку ви можете:
а) Зробити незаконним наявність рівності типу значення, що допускає обнулення, в if
операторі, оскільки для if
оператора потрібен bool, а не nullable bool. Натомість вимагайте від усіх, HasValue
якщо вони хочуть порівняти з null. Це багатослівно і дратує.
б) Автоматично перетворювати null у false. Недоліком цього є те, що x==null
повертає false, якщо x має значення null, що заплутано і працює проти розуміння людьми нульових порівнянь із посилальними типами.
Допустима рівність не може бути скасована. Нульова рівність є істинною чи помилковою, а порівняння з null - це нульова перевірка. Це робить нульову рівність суперечливою нерівній нерівності.
Жоден з цих варіантів, очевидно, не є правильним; всі вони мають плюси і мінуси. Наприклад, VBScript вибирає 1b. Після довгих дебатів команда дизайнерів C # обрала №2.