Как работает перегрузка оператора на истину и ложь? - PullRequest
7 голосов
/ 05 марта 2011

Вы можете перегрузить оператор true и false, я посмотрел примеры и нашел это http://msdn.microsoft.com/en-us/library/aa691312%28v=vs.71%29.aspx

Я совершенно не понимаю, как они работают. Я знаю, что если я напишу if (obj) и true вернет true, тогда выполняется if. Неважно, что ложное возвращается. Однако, как работает ложь? в этом документе предполагается, что оператор && использует его. Я написал код ниже. Я не знаю, как получить && для компиляции. || дает мне ошибку компиляции тоже. Как я могу получить ложный вызов? и как я могу получить && и || работать?

        var ts= new MyTimeSpan();// ts += ts;
        if (ts){ Console.WriteLine("Is true"); }
        else { Console.WriteLine("not true"); }
        //Console.WriteLine(ts && ts ? "Y" : "N");

    class MyTimeSpan
    {
        public static MyTimeSpan operator +(MyTimeSpan t, MyTimeSpan t2) { return new MyTimeSpan(); }
        public static bool operator true(MyTimeSpan t) { return true; }
        public static bool operator false(MyTimeSpan t) { return false; }
    }

Ответы [ 3 ]

21 голосов
/ 05 марта 2011

Определяющим свойством оператора короткого замыкания является то, что ему не нужно оценивать правую сторону, если левая сторона уже определяет результат.Для or, если левая сторона равна true, результат будет верным в любом случае, и нет необходимости оценивать правую сторону.Для and это то же самое, за исключением того, что если левая сторона равна false, результат будет ложным.

Вам нужно перегрузить и |, и true, чтобы получить ||& и false для получения &&.

a||b соответствует чему-то вроде op_true(a)?a:(a|b).Поэтому, если оператор true возвращает true, ему не нужно оценивать выражение b.

a&&b соответствует чему-то вроде op_false(a)?a:(a&b).Таким образом, если оператор false возвращает true, ему не нужно вычислять выражение b.

Перегрузка операторов короткого замыкания полезна при создании пользовательского логического типа, такого как nullable bools (см. DBBool)

6 голосов
/ 05 марта 2011

При перегрузке операторов true и false они не просто возвращают true и false, они используются для определения, считается ли значение вашего типа истинным или ложным.

Если, например, нулевое значение в вашем классе представляет false, то ненулевое значение представляет true:

public static bool operator true(MyTimeSpan t) { return t.Value != 0; }
public static bool operator false(MyTimeSpan t) { return t.Value == 0; }

Поскольку операторы обратны друг другу, компилятору не нужно использовать оба, чтобы определить, является ли значение истинным или ложным. Если вы напишите if(obj), компилятор будет использовать оператор true, чтобы определить, является ли значение истинным.

1 голос
/ 05 марта 2011

Вам нужно будет переопределить & оператор для && и | или ||.

Что-то вроде этого: (просто фиктивный код)

public static MyTimeSpan operator &(MyTimeSpan t, MyTimeSpan s) { return t; }

public static MyTimeSpan operator |(MyTimeSpan t, MyTimeSpan s) { return t; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...