Я искал реальный рабочий код, в котором действительно выполняется перегруженный оператор 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
для второго аргумента, а вместо этого выполняет перегруженный оператор &
для операндов.
Когда можно это когда-нибудь будет полезно? Или как я могу сделать свой тип таким, чтобы он мог проверять истинность обеих переменных?