2009-02-26 12 views
7

mio codice è ...Perché il resharper esegue la seguente raccomandazione?

public static void AssertNotNull<T>(string name, T val) { 
    if (val == null) 
     throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
} 

ReSharper raccomanda ...

public static void AssertNotNull<T>(string name, T val) { 
    if (Equals(val, default(T))) 
     throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
} 
+0

Sono cose come quelle che fanno il resharper del valore di dieci volte. –

+1

Interessante domanda +1, solo una cosa potresti per favore inserire più informazioni nel titolo per rendere più facile trovare la prossima volta di risposta "Perché il resharper consiglia di sostituire val == null con Equals (val, default (T))" Grazie. –

risposta

13

Perché non sa se T è un tipo di valore o di riferimento di tipo, in modo che rende il codice di lavoro con entrambi.

+0

quindi se volessi fare quanto segue per assicurarti che sia un ref type, cosa metto per XXX? vuoto statico AssertNotNull (nome stringa, T val) dove T: XXX – JeremyWeir

+0

nm Michael Meadows ha risposto a quella parte – JeremyWeir

+2

In realtà non concordo con Resharper in questo caso, se è per questo che sta dando quell'errore. Pensateci, se T è un int, e il valore IS in realtà 0 e DOVREBBE essere pari a zero, genererà un'eccezione, mentre se verificate il null, non genererebbe un'eccezione. – BFree

12

mi seconda risposta di Berado, ma vorrei aggiungere che è possibile evitare questo aggiungendo il vincolo di seguito:

public static void AssertNotNull<T>(string name, T val) where T : class 
+0

grazie, che ha molto senso – JeremyWeir

1

Questi due metodi non sono equivalenti. Il primo consente AssertNotNull ("pippo", 0) mentre il secondo lancia. Penso che Resharper sia troppo zelante in questo caso.

+0

Il tuo punto è in loco. Resharper lo contrassegna come warn (giallo) per impostazione predefinita. Vuole solo avvisarti che questo metodo non funzionerà come previsto per tutti i possibili input. –

+0

e una revisione: AssertNotNull ("pippo", 0) non genererà un'eccezione, si comporterà come se fosse un valore nullo, poiché il valore predefinito per int è 0, quindi equals (val, default (T)) valuta al vero –

+0

Intendevo che "lanciare la nuova ArgumentNullException" verrà eseguito nel secondo metodo. Sei d'accordo? – Greg

2

Questo ovviamente non è quello che volete in questo caso, ma è solo cercando di essere d'aiuto, facendo in modo che non si introducono un bug dimenticando che i tipi di riferimento può essere utilizzato per T. Come ha detto @Michael Meadows, probabilmente si desidera aggiungere il vincolo class a T.

0

Suppongo che T potrebbe essere un tipo non di riferimento.

0

se sai che T sarà sempre una classe, quindi aggiungi una clausola where per dirlo, quindi il tuo codice originale sarà OK.

public static void AssertNotNull<T>(string name, T val) 
    where T : class 
    { 
     if (val == null) 
      throw new ArgumentNullException(String.Format("{0} must not be null", name)); 
    } 
Problemi correlati