Це випливає з статті MSDN, яку ви пов’язали з нею, було надано для дозволу змінних булевих типів до введення типу Nullable (тобто int?, Bool? Тощо) на мові в C # 2. Таким чином, ви зберігаєте внутрішнє значення, яке вказує, чи є значення істинним, або хибним, або нульовим, тобто у вашому прикладі> 0 для істинного, <0 для помилкового і == 0 для нульового, і тоді ви отримаєте нульову семантику в стилі SQL. Також вам доведеться реалізувати метод або властивість .IsNull для того, щоб нікчемність могла бути чітко перевірена.
Порівнюючи SQL, уявіть таблицю Таблиця з 3 рядками зі значенням Foo, встановленою на істинне, 3 рядки зі значенням Foo, встановленою на false, і 3 рядки зі значенням Foo, встановленим на нуль.
SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE
6
Для підрахунку всіх рядків вам слід зробити наступне:
SELECT COUNT(*) FROM Table WHERE Foo = TRUE OR Foo = FALSE OR Foo IS NULL
9
Цей синтаксис "IS NULL" мав би еквівалентний код у вашому класі як .IsNull ().
LINQ робить порівняння з C # ще зрозумілішим: -
int totalCount = (from s in MyTypeEnumerable
where s || !s
select s).Count();
Уявляючи, що MyTypeEnumberable має абсолютно однаковий вміст бази даних, тобто 3 значення, що дорівнюють істинному, 3 значення рівні хибні та 3 значення, що дорівнюють нулю. У цьому випадку totalCount оцінить до 6 у цьому випадку. Однак, якщо ми переписали код як: -
int totalCount = (from s in MyTypeEnumerable
where s || !s || s.IsNull()
select s).Count();
Тоді TotalCount оцінив би до 9.
Приклад DBNull, наведений у пов'язаній статті MSDN про помилковий оператор, демонструє клас у BCL, який має таку точну поведінку.
Насправді висновок полягає в тому, що ви не повинні використовувати це, якщо ви абсолютно не впевнені, що хочете такого типу поведінки, краще просто використовувати набагато простіший зведений синтаксис !!
Оновлення: я щойно помітив, що вам потрібно вручну переохопити логічні оператори !, || і &&, щоб зробити цю роботу належним чином. Я вважаю, що хибний оператор подає в ці логічні оператори, тобто вказує на правду, хибність чи "інше". Як зазначається в іншому коментарі! X не вийде з місця; вам доведеться перевантажувати !. Дивацтво!