2010-04-19 17 views
16

Ho letto di overloading true e false in C# e penso di capire la differenza fondamentale tra questo e definire un operatore bool. L'esempio che vedo in giro è qualcosa di simile:Perché sovraccaricare true e false invece di definire l'operatore bool?

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

Per me, questo è lo stesso che dire:

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

La differenza, per quanto posso dire, è che attraverso la definizione di vero e falso a parte, si può avere un oggetto che è allo stesso tempo vero e falso, o né vere né false:

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; } 

sono sicuro che c'è un motivo per cui questo è consentito, ma non riesco proprio a pensare a quello che è. Per me, se vuoi che un oggetto possa essere convertito in vero o falso, un singolo operatore bool ha più senso.

Qualcuno può darmi uno scenario in cui ha senso farlo in un altro modo?

Grazie

+0

Ho appena trovato anche questi operatori e ho fatto alcuni test. Sembra che 'if' usi solo l'operatore' true' e 'if (! MyObj)' non sia affatto possibile, quindi non ha senso (ancora) implementare un operatore 'false' contraddittorio. Mi sono perso qualcosa? Come posso usare l'operatore 'false'? – ygoe

risposta

11

Come the docs dire, sovraccarico true e false è inteso per supportare (annullabili) tipi di database (Sì/No, Y/N, 0/1, ecc.).

E ovviamente è possibile definirli in modo incoerente, come con qualsiasi operatore. È tua responsabilità restituire qualcosa di sensato. Il compilatore non va oltre il richiedere né l'uno né l'altro.

+0

Grazie - Non sono arrivato così lontano in MSDN - Ho iniziato a cercare altrove dopo il loro [overloading dell'operatore] (http://msdn.microsoft.com/en-us/library/aa288467 (VS.71% 29.aspx " overloading dell'operatore "), che non è stato di grande aiuto, suppongo di non aver pensato al fatto che è possibile sovraccaricare == /! = allo stesso modo, dove sono in conflitto tra loro, non potrei mai immaginare di farlo davvero Grazie per il suggerimento –

1

seconda del sistema, vera può essere qualsiasi valore diverso da zero. In altri, può essere un qualsiasi valore positivo.

Altri sistemi non sono veramente booleani e consentono un terzo stato null o nill per i valori booleani, motivo per cui si potrebbe sovraccaricare vero e falso, rispetto a sovraccaricare un singolo operatore bool.

+0

Questo è specifico per .NET, quindi stai dicendo che è per le applicazioni .NET che comunicano con codice non- .NET? –

+0

Joe, questa è una caratteristica delle specifiche per C#, non .NET. C# potrebbe essere usato in qualsiasi sistema, e true e false potrebbero aver bisogno di cambiare la loro definizione. –

+0

Benjamin: Grazie per la risposta - alcuni commenti: In primo luogo, credo che questo sia il caso per altri linguaggi .NET, non solo C# - VB.NET ha operatori speciali IsTrue e IsFalse che sembrano essere la stessa cosa, a meno che non mi sbagli. Inoltre, hai detto che C# potrebbe essere usato in qualsiasi sistema - ho sentito alcune persone dire cose del genere in passato, ma non ho mai sentito spiegazioni. Oltre a Mono, c'è qualche altro posto al di fuori di .NET dove C# viene effettivamente utilizzato? Grazie –

1

Ho visto persone sovraccaricare gli overload true e false per fare cose intelligenti come costruire espressioni in .NET 2.0, prima che Linq esistesse.

Ayende elaborato una sintassi come questo per costruire criteri di NHibernate query, utilizzando il suo progetto NHQG:

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

Ahh, i giorni prima di LINQ ... Quelli erano tempi innocenti in cui le persone facevano cose atroci che erano intelligenti al momento ... –

7

non avevo idea di questi operatori esistevano. Ciò significa che è possibile implementare il paradosso di auto-negazione:

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; 
    } 
} 

Così ora sappiamo che la vera soluzione a questo classico paradosso ... StackOverflowException.

+0

bool pubblico ThisMethodReturnsFalse() {return true;} –

Problemi correlati