2015-05-13 12 views
8

Nel seguente frammento C#, sovrascrivo il metodo ==. _type è un numero di tipo short. Quindi in realtà sto dicendo che due WorkUnitType s sono gli stessi quando quei due short s sono uguali.Verifica null in == override

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (type1 == null || type2 == null) 
     return false; 
    return type1._type == type2._type; 
} 

Perché R # mi avverte, ed è del tutto chiaro il motivo per cui, che type1/type2 potrebbe potenzialmente essere nullo Sto cercando di recuperare quello con il if dichiarazione di cui sopra.

Ora sto ottenendo uno StackOverflowException che ha perfettamente senso perché in realtà sto chiamando l'override.

Domanda: Come si scrive questo metodo "corretto". Come posso rilevare che type1 o type2 possono essere null?

La mia ipotesi migliore: Forse sono solo abusando == qui e il controllo per l'uguaglianza deve essere fatto con la Equals override. Ma continuo a pensare che il problema esista. Allora, dov'è il mio errore nel ragionamento?

risposta

9

Stai cercando la funzione ReferenceEquals(), che verrà confrontata direttamente, evitando il sovraccarico dell'operatore.

+0

Non sapevo che 'ReferenceEquals' esiste. Questa è in realtà la risposta. Grazie. – Stephan

2

Oltre a ciò che SLaks ha detto, è probabile che si desideri restituire true se entrambi sono uguali a null. Quindi, in questo modo:

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (ReferenceEquals(type1, null)) 
     return ReferenceEquals(type2, null); 

    if (ReferenceEquals(type2, null)) 
     return false; 

    return type1._type == type2._type; 
} 
1

Per completezza: è anche possibile lanciare i due argomenti a object. Questo utilizzerà l'implementazione definita in object e non quella personalizzata.

in codice:

if ((object) type1 == null || (object) type2 == null)