Почему истина и ложь перегрузки вместо того, чтобы определить bool оператор?

Я читал о перегрузке истины и лжи в 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 оператор имеет большую часть смысла.

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

Спасибо

18
задан Joe Enos 19 April 2010 в 21:24
поделиться

4 ответа

Как сказано в документации, перегрузка true и false предназначена для поддержки (nullable) типов баз данных (Yes/No, Y/N, 0/1, etc).

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

12
ответ дан 30 November 2019 в 08:43
поделиться

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

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

return Repository.FindAll(
    (Where.Publisher.Name == name) &&
    (Where.Publisher.City == city));
2
ответ дан 30 November 2019 в 08:43
поделиться

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

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.

8
ответ дан 30 November 2019 в 08:43
поделиться

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

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

1
ответ дан 30 November 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: