2012-02-08 17 views
8

Così, sto facendo un sacco di lavoro di database in un'applicazione - e ci sono diversi valori di ritorno possibili del mio sistema di caching. Può restituire null, può restituire un valore predefinito (type) o può restituire un oggetto non valido (da oggetto non valido, intendo uno con proprietà/valori errati). Voglio creare un metodo di estensione per fare tutti questi controlli per me, in questo modo:Metodo di estensione controllo nullo

public static bool Valid<T> (this T obj) where T: class 
    { 
     if (obj == null) 
      return false; 
     else if (obj == default(T)) 
      return false; 
     //Other class checks here 
     else 
      return true; 
    } 

Il problema è, il mio compilatore mi sta dicendo che if (obj == default(T)) sarà sempre falso.

Perché è quello?

+0

Ti sta dando un errore o un avvertimento del compilatore. Non sto ottenendo nessuno dei due compila bene. –

+3

@GregB. È probabilmente 'resharper' che gli dà un suggerimento ... – gdoron

+0

@GregB si, ho resharper. – caesay

risposta

21

Dal momento che si dispone di un vincolo di "classe" (where T: class), default(T) è sempre uguale a null. Hai già un controllo per quello nell'istruzione if originale, quindi il secondo caso (obj == default(T)) non potrebbe mai essere vero.

0

La prima decisione che dovete fare è: Can T essere un tipo di valore come int?
Se è così è possibile rimuovere

where T: class 

e

if (obj == null) return false; 
else 

Se T è sempre un tipo di riferimento è possibile rimuovere

if (obj == null) return false; 
1

Non sono sicuro se si sta vincolando andare in classe perché vuoi o perché senti di doverlo fare. Se si tratta di quest'ultimo, ecco un modo per fare valore di default il controllo sui tipi complessi e semplici:

public static bool Valid<T> (this T obj) 
{ 
    return !EqualityComparer<T>.Default.Equals(obj, default(T)); 
} 

Se la vostra scelta per vincolare alla classe era solo intenzionale o per un caso aziendale, si sentono liberi di ignorare questo suggerimento . Un'altra cosa che questo non può spiegare è il pugilato di tipi semplici (anche se di solito uso tipi nullable semplici in questi giorni, per cui questo codice funziona).

Problemi correlati