Как видно из статьи MSDN, на которую вы ссылались, она была предоставлена для допускающих обнуляемый логический тип до того, как тип Nullable (т.е. int ?, bool? И т. Д.) Был введен в язык в C # 2. Таким образом, вы бы сохранили внутреннее значение, указывающее, является ли значение истинным, ложным или нулевым, т.е. в вашем примере> 0 для истинного, <0 для ложного и == 0 для нулевого, а затем вы получите нулевую семантику в стиле SQL. Вы также должны будете реализовать метод или свойство .IsNull, чтобы можно было явно проверить недействительность. </p>
По сравнению с SQL, представьте таблицу Table с 3 строками со значением Foo, установленным в значение true, 3 строками со значением Foo, установленным в значение false, и 3 строками со значением Foo, установленным в значение null.
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 значения равны true, 3 значения равны false и 3 значения равны нулю. В этом случае totalCount будет оцениваться до 6 в этом случае. Однако, если мы переписали код как: -
int totalCount = (from s in MyTypeEnumerable
where s || !s || s.IsNull()
select s).Count();
Тогда totalCount оценивается в 9.
Пример DBNull, приведенный в связанной статье MSDN об операторе false, демонстрирует класс в BCL, который имеет такое точное поведение.
По сути, вывод заключается в том, что вы не должны использовать это, если вы не уверены, что хотите такого типа поведения, лучше просто использовать гораздо более простой синтаксис, допускающий обнуление !!
Обновление: Я только что заметил, что вам нужно вручную переопределить логические операторы!, || и && для правильной работы. Я полагаю, что ложный оператор подает эти логические операторы, то есть указывает на правду, ложь или «иное». Как отмечено в другом комментарии! X не сработает; Вы должны перегрузить! Weirdness!