Зачем перегружать истину и ложь вместо определения оператора Bool?
-
28-09-2019 - |
Вопрос
Я читал об перегрузке истинного и ложного в C #, и я думаю, что понимаю основную разницу между этим и определяющим оператором Bool. Пример, который я вижу вокруг, это что-то вроде:
public static bool operator true(Foo foo) {
return (foo.PropA > 0);
}
public static bool operator false(Foo foo) {
return (foo.PropA <= 0);
}
Для меня это так же, как говорится:
public static implicit operator bool(Foo foo) {
return (foo.PropA > 0);
}
Разница, насколько я могу сказать, это то, что, определяя истинно и ложно отдельно, вы можете иметь объект, который и верно, так и ложный, либо ни правда, ни ложь:
public static bool operator true(Foo foo) { return true; }
public static bool operator false(Foo foo) { return true; }
//or
public static bool operator true(Foo foo) { return false; }
public static bool operator false(Foo foo) { return false; }
Я уверен, что есть причина, по которой это разрешено, но я просто не могу думать о том, что это такое. Для меня, если вы хотите, чтобы объект мог быть в состоянии преобразовать в True или False, один оператор Bool имеет самый смысл.
Кто-нибудь может дать мне сценарий, где имеет смысл сделать это другим способом?
Спасибо
Решение
Так как Документы Скажем, перегрузка true
а также false
Предназначен для поддержки (отнудимых) типов баз данных (да / нет, Y / N, 0/1 и т. Д.).
И, конечно, вы можете определить их непоследовательно, как и в любом операторе. Это ваша ответственность за то, чтобы вернуть что-то разумное. Компилятор не доходит дальше, чем требует ни одного или обоих.
Другие советы
Я понятия не имел, эти операторы существовали. Это означает, что вы можете реализовать парадокс саморегуляции:
public class ThisClassIsFalse
{
public static bool operator true(ThisClassIsFalse statement)
{
return statement ? false : true;
}
public static bool operator false(ThisClassIsFalse statement)
{
return statement ? true : false;
}
}
Так что теперь мы знаем истинное решение этого классического парадокса ... StackoverFlowException.
Я видел людей перегружать true
а также false
Перегрузки, чтобы сделать умные вещи, такие как выражения здания в .NET 2.0, до существования LINQ.
Yyende Разработано синтаксис, как это, чтобы построить запросы критериев Nhibernate, используя его проект NHQG:
return Repository.FindAll(
(Where.Publisher.Name == name) &&
(Where.Publisher.City == city));
В зависимости от системы, правда может быть любое ненулевое значение. В других это может быть любая положительная ценность.
Другие системы не являются по-настоящему логическими и допускают третий штат NULL или NILL для логических ценностей, поэтому вы можете перегружать истинные и ложные, против перегрузки одного оператора Bool.