2013-07-16 16 views
5

少し謎の底に辿り着きます。条件文が異なる結果をもたらす場合If Then

声明場合、私は次のようにあります。ここmyVal

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

終了値は、どういうわけか、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であると仮定して、NothingGuid.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? 'でコンパイラエラーを起こすでしょうか?ヌル:入力。 VB.Netは明らかにもっと "寛容"です。 –

+0

@asawyerもう少し考えてみると、VB.Netは 'Nothing'が特定のコンテキストでデフォルト値とおおよそ同等であると考えているからです。例えば。 'Dim foo As Guid = Nothing'は' Option Strict'でもうまくいき、 'ldloca.s 00;にコンパイルします。 initobj System.Guid'。 –

関連する問題