Зачем перегружать истину и ложь вместо определения оператора Bool?

StackOverflow https://stackoverflow.com/questions/2671012

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top