2015-04-23 16 views
6

Ecco qualche esempio di codice:Perché questo è un confronto valido

static DateTime time; 
if (time == null) 
{ 
/* do something */ 
} 

Dal DateTime non può essere nullo, perché questo codice compilato?

Edit: Il problema non è solo che questo codice restituisce sempre falso, ma perché qualcosa come DateTime quali è mai nulla è consentito in un tale confronto.

+4

Credo sia perché esiste una conversione implicita da "DateTime' a" DateTime? ". Tuttavia, questa conversione non è verificata in modo coerente ... –

+0

(O almeno non è stato controllato in modo coerente ... Sono sicuro che c'erano alcune stranezze intorno ad esso, ma non riesco a riprodurle con Roslyn.) –

risposta

6

Sebbene il valore time sia di tipo non annullabile, può essere convertito in valori Null e confrontato con null. Il confronto darebbe false, che è un risultato valido.

Ciò non significa, tuttavia, che sia un buon codice. Strumenti, come ad esempio re: più nitido, contrassegnano questa riga con un avvertimento che dice "L'espressione è sempre falsa".

+2

Anche Roslyn :) –

+1

Visual Studio 2013 visualizza un avviso per alcuni, ma non per tutti i tipi di valore. Per esempio, se tu avessi usato 'int' invece di' DateTime', avresti ottenuto una linea verde ondulata (attenzione) "l'espressione è sempre falsa"; con 'DateTime' non ricevi questo avviso. – stakx