Когда когда-либо запускается перегруженный ложный оператор и для чего он нужен?

Я искал реальный рабочий код, в котором действительно выполняется перегруженный оператор false .

Этот вопрос (для чего подходит ложный оператор в C #?) в некоторой степени аналогичен, но принятый ответ ссылается на URL-адрес, который возвращает ошибку 404. Я также рассмотрел Как работает перегрузка оператора для истинных и ложных значений? и некоторые другие вопросы.

Практически во всех ответах я обнаружил, что false получает только выполняется при использовании короткозамкнутого типа x && y . Это оценивается как T.false (x)? x: T. & (x, y) . ​​

Хорошо, у меня есть следующий код. Структура содержит int и считает себя истинной, если int больше нуля.:

public struct MyStruct {
    private int _i;

    public MyStruct(int i) {
        _i = i;
    }

    public static bool operator true(MyStruct ms) {
        return ms._i > 0;
    }

    public static bool operator false(MyStruct ms) {
        return ms._i <= 0;
    }

    public override string ToString() {
        return this._i.ToString();
    }
}

Теперь я надеюсь, что следующая программа выполнится и будет использовать перегруженное false Оператор .

class Program {
    private static void Main() {
        MyStruct b1 = new MyStruct(1); // to be considered true
        MyStruct b2 = new MyStruct(-1); // to be considered false

        Console.WriteLine(b1 && b2);
        Console.WriteLine(b2 && b1);
    }
}

Однако он даже не компилируется. Он говорит, что не может применять оператор '&&' к операндам типа 'MyStruct' и 'MyStruct'.

Я знаю, что могу реализовать перегрузку оператора & . Итак, давайте сделаем это. и должны возвращать MyStruct , поэтому я не могу заставить его возвращать bool .

public static MyStruct operator &(MyStruct lhs, MyStruct rhs) {
    return new MyStruct(lhs._i & rhs._i);
}

Теперь код компилируется. Его выход - 1 и -1 . Таким образом, результат b1 && b2 не такой же, как результат b2 && b1 .

Если я отлаживаю код, я вижу, что b1 && b2 сначала выполняет оператор false на b1 , который возвращает false . Затем он выполняет оператор & для b1 и b2, который выполняется поразрядно, а также для 1 и -1, что приводит к 1. Таким образом, он действительно сначала проверяет, ложно ли b1.

Второе выражение, b2 && b1 сначала выполняет оператор false для b2 , который возвращает true . В сочетании с тем фактом, что я использую короткое замыкание, оно ничего не делает с b1 и просто выводит значение b2 .

Так что да, Оператор false выполняется при использовании короткого замыкания. Однако он не выполняет оператор true или false для второго аргумента, а вместо этого выполняет перегруженный оператор & для операндов.

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

10
задан Community 23 May 2017 в 10:08
поделиться