Я искал фактический рабочий код, где фактически запускается перегруженный оператор false
.
Этот вопрос (Что такое фальшивый оператор в С# для?), является одним и тем же, но принятый ответ ссылается на 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".
Я знаю, что могу реализовать перегрузку оператора &
. Так что сделайте это. &
должен возвращать a 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
во втором аргументе, но вместо этого выполняет перегруженный оператор &
в операндах.
Когда это когда-нибудь может быть полезно? Или как я могу сделать свой тип так, чтобы он мог проверить, истинны ли обе переменные?