He estado buscando código de trabajo real donde se ejecuta realmente un operador false
sobrecargado.¿Cuándo se ejecuta el operador falso sobrecargado y para qué sirve?
This question (What's the false operator in C# good for?) es algo similar, pero la respuesta aceptada se vincula a una url que devuelve un error 404. También miré How does operator overloading of true and false work? y algunas otras preguntas.
Lo que he encontrado en casi todas las respuestas es que false
solo se ejecuta cuando usa un cortocircuito y como x && y
. Esto se evalúa como T.false(x) ? x : T.&(x, y)
.
Ok, entonces tengo el siguiente código. El struct
contiene un int
y se considere cierto si el int es mayor que cero .:
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();
}
}
Ahora espero el siguiente programa se ejecutará y el uso de la false
operador sobrecargado.
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);
}
}
Sin embargo, ni siquiera compila. Dice que no puede aplicar el operador '& &' a los operandos del tipo 'MyStruct' y 'MyStruct'.
Sé que puedo implementar una sobrecarga del operador &
. Así que hagámoslo. El &
debe devolver un MyStruct
, por lo que no puedo hacer que devuelva un bool
.
public static MyStruct operator &(MyStruct lhs, MyStruct rhs) {
return new MyStruct(lhs._i & rhs._i);
}
Ahora el código se compila. Su salida es 1
y -1
. Por lo tanto, el resultado de b1 && b2
no es el mismo que el de b2 && b1
.
Si puedo depurar el código, veo que b1 && b2
primero se ejecuta el operador false
en b1
, que devuelve false
. A continuación, realiza el operador &
en b1 y b2, que se realiza en modo bit y en 1 y -1, lo que da como resultado 1. Por lo tanto, en primer lugar se comprueba si b1 es falso.
La segunda expresión, b2 && b1
primero ejecuta el operador false
en b2
, que devuelve true
. Combinado con el hecho de que estoy usando un cortocircuito, no hace nada con b1
y solo imprime el valor de b2
.
Así que sí, el operador false
se ejecuta cuando utiliza un cortocircuito. Sin embargo, no ejecuta el operador true
o false
en el segundo argumento, sino que ejecuta el operador sobrecargado &
en los operandos.
¿Cuándo puede ser útil? ¿O cómo puedo hacer mi tipo para que pueda verificar si las dos variables son verdaderas?
¿Ha intentado sobrecargar el operador '&&'? – Snowbear
@sSnowbear: ¿qué quieres decir? No puedes sobrecargar el && o || operadores. Ver [http://msdn.microsoft.com/en-us/library/8edha89s(v=VS.100).aspx](MSDN). – comecme
@Snowbear: esa era exactamente la funcionalidad que el autor del artículo original intentaba lograr, aunque Microsoft no permite sobrecargar el && y || operadores. – IAmTimCorey