3

我使用VB.Net,Visual Studio 2010,.Net version 4.5.50938 SP1Rel日期比較myDateTime.Equals(DateTime.MinValue)不能在VB.Net中工作

當DateTime參數爲空時,我看到傳遞的值是#12:00:00 AM#,它基本上是DateTime.MinValue。假設myDateTime(其爲空)的日期時間參數我傳球,

Dim newDateTime As Nullable(Of DateTime) = If(myDateTime.Equals(DateTime.MinValue), Nothing, myDateTime) 

使得newDateTime的值作爲「#12:00:00 AM#」,而不是沒有的。我證實If條件返回true。誰能告訴我爲什麼Nullable(Of DateTime)不是Nothing?

此外,下面的代碼工作,並沒有進入If循環。

Dim newDateTime As Nullable(Of DateTime) = Nothing 
If (Not myDateTime.Equals(DateTime.MinValue)) Then 
    newDateTime = myDateTime 
End If 

回答

4

使用「If」運算符時,兩個返回值必須是相同的類型。在這種情況下,If爲true和false返回一個DateTime。你可以通過執行下面的代碼來看到它(它不會被編譯)。

If(True, 123, "aaa") 

所以你沒有得到一個真正的沒有。相反,只是返回一個空值。

Dim newDateTime As Nullable(Of DateTime) = If(myDateTime.Equals(DateTime.MinValue), New Nullable(Of DateTime), myDateTime) 

還是喜歡阿爾曼說

Dim newDateTime As Nullable(Of DateTime) = If(myDateTime.Equals(DateTime.MinValue), CType(Nothing, DateTime?), myDateTime) 

更重要的是,不要試圖把一切都在同一行)

+0

其實只是改變「myDateTime」爲可空日期還修復了問題 - 因此它可以在不改變'Nothing'的情況下解決,問題在於VB中的'Nothing'是不明確的 - 有時表示空引用值,有時表示值類型的默認值。 –

+2

這不是一個錯誤。由於兩邊需要具有相同的類型,所以If返回DateTime。因此,編譯器會執行如下操作:If myDateTime.Equals(DateTime.MinValue),CType(Nothing,DateTime),myDateTime) –

+0

@DaveDoknjas將myDateTime更改爲可爲空的日期使得兩個返回值的類型相同。 – Arman

1

「如果」 操作符作爲你的榜樣:

Dim newDateTime As Nullable(Of DateTime) = If(myDateTime.Equals(DateTime.MinValue), Nothing, myDateTime) 

應該相同理想工作,下面的代碼片段,其中確實集newDateTime爲Nothing:

Dim newDateTime As Nullable(Of DateTime) 
If myDateTime.Equals(DateTime.MinValue) Then 
    newDateTime = Nothing 
Else 
    newDateTime = myDateTime 
End If 

在原始的「If」示例中,VB將'Nothing'視爲與myDateTime和'Nothi'相同的類型ng'在VB中的值類型只是該類型的默認值,所以'Nothing'與引用類型一起使用時不是'Nothing'。如果將'myDateTime'更改爲可空日期,則VB將'Nothing'視爲參考類型'Nothing'。問題是VB中的'Nothing'是不明確的。