2010-04-19 16 views
16

He estado leyendo sobre la sobrecarga de verdadero y falso en C#, y creo que entiendo la diferencia básica entre esto y la definición de un operador bool. El ejemplo que veo alrededor es algo así como:¿Por qué sobrecargar verdadero y falso en lugar de definir el operador bool?

public static bool operator true(Foo foo) { 
    return (foo.PropA > 0); 
} 
public static bool operator false(Foo foo) { 
    return (foo.PropA <= 0); 
} 

Para mí, esto es lo mismo que decir:

public static implicit operator bool(Foo foo) { 
    return (foo.PropA > 0); 
} 

La diferencia, por lo que yo puedo decir, es que mediante la definición verdadero y falso por separado, puede tener un objeto que es a la vez verdadera y falsa o verdadera ni falsa:

public static bool operator true(Foo foo) { return true; } 
public static bool operator false(Foo foo) { return true; } 
//or 
public static bool operator true(Foo foo) { return false; } 
public static bool operator false(Foo foo) { return false; } 

estoy seguro de que hay una razón esto está permitido, pero simplemente no puede pensar en lo que es. Para mí, si quieres que un objeto se convierta en verdadero o falso, un solo operador de bool tiene más sentido.

¿Alguien puede darme un escenario donde tiene sentido hacerlo de otra manera?

Gracias

+0

Acabo de encontrar estos operadores también e hice algunas pruebas. Parece que 'if' solo utiliza el operador' true', y 'if (! MyObj)' no es posible en absoluto, por lo que no tiene sentido (todavía) implementar un operador 'falso' contradictorio. ¿Yo me perdí algo? ¿Cómo puedo usar el operador 'false' en absoluto? – ygoe

Respuesta

11

Como the docs decir, la sobrecarga true y false está destinado a apoyar (anulables) de bases de datos de tipo (Sí/No, S/N, 0/1, etc.).

Y, por supuesto, puede definirlos de forma incoherente, como con cualquier operador. Es su responsabilidad devolver algo sensato. El compilador no va más allá de requerir ninguno o ambos.

+0

Gracias - No llegué tan lejos en MSDN - Empecé a buscar en otro lado después de su [sobrecarga del operador] (http://msdn.microsoft.com/en-us/library/aa288467 (VS.71% 29.aspx " sobrecarga del operador ") página, lo que no fue de mucha ayuda. Supongo que no pensé en el hecho de que puedes sobrecargar == /! = de la misma manera, donde entran en conflicto entre ellos, simplemente nunca podría imaginarme haciendo realmente Gracias por la sugerencia. –

1

En función del sistema, la verdadera pueden ser cualquier valor que no sea cero. En otros, puede ser cualquier valor positivo.

Otros sistemas no son verdaderamente booleanos, y permiten un tercer estado nulo o nulo para los valores booleanos, por lo que puede sobrecargar verdadero y falso, en vez de sobrecargar un solo operador bool.

+0

Esto es específicamente para .NET, ¿entonces estás diciendo que es para aplicaciones .NET que hablan con código que no es .NET? –

+0

Joe, esta es una característica en la especificación para C#, no .NET. C# podría usarse en cualquier sistema, y ​​verdadero y falso podría necesitar que se cambie su definición. –

+0

Benjamin: Gracias por la respuesta - algunos comentarios: Primero, creo que este es el caso para otros lenguajes .NET, no solo C# - VB.NET tiene los operadores especiales IsTrue e IsFalse que parecen ser lo mismo, a menos que esté equivocado. Además, mencionaste que C# podría usarse en cualquier sistema. He escuchado a algunas personas decir cosas como esta en el pasado, pero nunca escuché explicaciones. Aparte de Mono, ¿hay algún otro lugar fuera de .NET donde realmente se usa C#? Gracias –

1

He visto personas sobrecargar las sobrecargas true y false para hacer cosas inteligentes como construir expresiones en .NET 2.0, antes de que existiera Linq.

Ayende elaborado una sintaxis como esta para construir criterios de NHibernate consultas, mediante su proyecto NHQG:

return Repository.FindAll(
    (Where.Publisher.Name == name) && 
    (Where.Publisher.City == city)); 
+5

Ahh, los días previos a LINQ ... Esas fueron épocas inocentes en las que la gente hacía cosas atroces que eran inteligentes en ese momento ... –

7

no tenía ni idea existían estos operadores. Esto significa que puede poner en práctica la paradoja de auto-negación:

public class ThisClassIsFalse 
{ 
    public static bool operator true(ThisClassIsFalse statement) 
    { 
     return statement ? false : true; 
    } 

    public static bool operator false(ThisClassIsFalse statement) 
    { 
     return statement ? true : false; 
    } 
} 

Así que ahora sabemos la verdadera solución a esta paradoja clásica ... StackOverflowException.

+0

public bool ThisMethodReturnsFalse() {return true;} –

Cuestiones relacionadas