2015-04-23 39 views
6

下面是一些示例代碼:爲什麼這是一個有效的比較

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

由於DateTime不能爲空,爲什麼會發生這種代碼編譯?

編輯: 問題不只是這個代碼將始終返回false,但爲什麼像DateTime這是從未空被允許在這樣的比較。

+4

我相信這是因爲有'DateTime'到'DateTime?'的隱式轉換。然而,這種轉換不會一致檢查... –

+0

(或者至少沒有被一致檢查...我確定過去有一些古怪的東西,但我無法用Roslyn重現它們。) –

回答

6

儘管time是非空值類型,但它可以轉換爲空值並與null進行比較。比較將產生false,這是一個有效的結果。

但這並不意味着它是一個很好的代碼。諸如re:sharper之類的工具會在此行上標註「表達總是爲假」的警告。

+2

Roslyn也是如此:) –

+1

Visual Studio 2013顯示一些警告,但不是所有的值類型。例如,如果您使用'int'而不是'DateTime',則會出現綠色波浪線(警告),「表達式始終爲false」; 'DateTime'你不會得到這樣的警告。 – stakx

相關問題