Я искал фактический рабочий код, где фактически выполняется перегруженный оператор false
.
Этот вопрос (для чего хорош ложный оператор в C #?) несколько такой же, но принятый ответ ссылается на URL, который возвращает ошибку 404. Я также посмотрел на Как работает перегрузка операторов для истинного и ложного? и некоторые другие вопросы.
То, что я нашел почти во всех ответах, это то, что false
исполняется только тогда, когда вы используете короткое замыкание и как x && y
. Это оценивается как T.false(x) ? x : T.&(x, y)
.
Хорошо, у меня есть следующий код. struct
содержит 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
first, выполняет оператор false
для b2
, который возвращает true
. В сочетании с тем, что я использую короткое замыкание, он ничего не делает с b1
и просто печатает значение b2
.
Так что да, оператор false
выполняется при использовании короткого замыкания. Однако он не выполняет оператор true
или false
для второго аргумента, а вместо этого выполняет перегруженный оператор &
для операндов.
Когда это может быть полезно? Или как я могу сделать свой тип таким образом, чтобы он мог проверить, истинны ли обе переменные?