2013-07-16 88 views
5

試圖找到一個小神祕的底部。條件語句產生不同的結果,然後如果然後

我有以下if語句:

Dim myVal As Nullable(Of Guid) 
myVal = If(vendor.Address.ID = Guid.Empty, Nothing, vendor.Address.ID) 

myVal終值這裏,莫名其妙地,Guid.Empty

如果我寫相同的代碼如下:

Dim myVal As Nullable(Of Guid) 
If(vendor.Address.ID = Guid.Empty) Then 
    myVal = Nothing 
Else 
    myVal = vendor.Address.ID 
End If 

爲什麼不同?

+0

試試這個:'如果(vendor.Address.ID.Equals(Guid.Empty),沒什麼, vendor.Address.ID)' – asawyer

+0

@Blam你能澄清你的意思嗎? – asawyer

+0

@Blam:你能澄清你的意思嗎?我以爲我在做2,是不是條件在VB中工作的方式? –

回答

3

問題在於VB.NET如何使用If運算符推斷類型。兩個操作數必須是相同的類型。假設一方爲Nothing,另一方爲Guid,則假定結果類型應爲Guid,因此它將Nothing強制爲Guid.Empty。在任何一方放置Nullable(Of Guid)將足以告訴編譯器,這就是你真正想要的。

這應該給你你所期望的結果:

Dim myVal2 As Nullable(Of Guid) 
myVal2 = If(vendor.Address.ID = Guid.Empty, CType(Nothing, Nullable(Of Guid)), vendor.Address.ID) 

或者這樣:

Dim myVal2 As Nullable(Of Guid) 
myVal2 = If(vendor.Address.ID = Guid.Empty, Nothing, CType(vendor.Address.ID, Nullable(Of Guid))) 
+0

這真的很有趣。即使'Option Strict'也不會警告你這種行爲。 – asawyer

+0

C#會在input == Guid.Empty中引發編譯器錯誤? null:input'。 VB.Net顯然更「寬容」。 –

+0

@asawyer考慮一下,我想這是因爲VB.Net認爲'Nothing'在某些情況下大致等於默認值。例如。 'Dim foo As Guid = Nothing'即使在Option Strict下也沒問題,並且編譯爲'ldloca.s 00; initobj System.Guid'。 –