Зачем перегружать true и false вместо определения оператора bool? - PullRequest
18 голосов
/ 20 апреля 2010

Я читал о перегрузке true и false в 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.

Кто-нибудь может дать мне сценарий, в котором имеет смысл сделать это по-другому?

Спасибо

Ответы [ 4 ]

12 голосов
/ 20 апреля 2010

Как говорят документы , перегрузка true и false предназначена для поддержки (обнуляемых) типов баз данных (Да / Нет, Да / Нет, 0/1 и т. Д.). *

И, конечно, вы можете определить их непоследовательно, как с любым оператором. Это ваша ответственность, чтобы вернуть что-то разумное. Компилятор не идет дальше, чем требование ни того, ни другого.

8 голосов
/ 20 апреля 2010

Я понятия не имел, что эти операторы существуют. Это означает, что вы можете реализовать парадокс самоотрицания:

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.

2 голосов
/ 20 апреля 2010

Я видел, как люди перегружали перегрузки true и false, чтобы делать умные вещи, такие как построение выражений в .NET 2.0, до того, как появился Linq.

Айенде разработал синтаксис для построения запросов критериев NHibernate, используя свой проект NHQG:

return Repository.FindAll(
    (Where.Publisher.Name == name) &&
    (Where.Publisher.City == city));
1 голос
/ 20 апреля 2010

В зависимости от системы, true может быть любым ненулевым значением. В других это может быть любое положительное значение.

Другие системы не являются по-настоящему логическими и допускают третье состояние null или nill для логических значений, поэтому вы можете перегружать true и false по сравнению с перегрузкой одного оператора bool.

...