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