下面是一些示例代碼:爲什麼這是一個有效的比較
static DateTime time;
if (time == null)
{
/* do something */
}
由於DateTime
不能爲空,爲什麼會發生這種代碼編譯?
編輯: 問題不只是這個代碼將始終返回false,但爲什麼像DateTime
這是從未空被允許在這樣的比較。
下面是一些示例代碼:爲什麼這是一個有效的比較
static DateTime time;
if (time == null)
{
/* do something */
}
由於DateTime
不能爲空,爲什麼會發生這種代碼編譯?
編輯: 問題不只是這個代碼將始終返回false,但爲什麼像DateTime
這是從未空被允許在這樣的比較。
儘管time
是非空值類型,但它可以轉換爲空值並與null
進行比較。比較將產生false
,這是一個有效的結果。
但這並不意味着它是一個很好的代碼。諸如re:sharper之類的工具會在此行上標註「表達總是爲假」的警告。
Roslyn也是如此:) –
Visual Studio 2013顯示一些警告,但不是所有的值類型。例如,如果您使用'int'而不是'DateTime',則會出現綠色波浪線(警告),「表達式始終爲false」; 'DateTime'你不會得到這樣的警告。 – stakx
我相信這是因爲有'DateTime'到'DateTime?'的隱式轉換。然而,這種轉換不會一致檢查... –
(或者至少沒有被一致檢查...我確定過去有一些古怪的東西,但我無法用Roslyn重現它們。) –