条件语句产生不同的结果然后If Then

Ref*_*din 5 .net vb.net conditional-statements

试图找到一个小秘密的底部.

我有以下If声明:

Dim myVal As Nullable(Of Guid)
myVal = If(vendor.Address.ID = Guid.Empty, Nothing, vendor.Address.ID)
Run Code Online (Sandbox Code Playgroud)

这里的最终价值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
Run Code Online (Sandbox Code Playgroud)

为什么不同?

p.s*_*w.g 3

问题在于 VB.NET 如何使用If运算符推断类型。两个操作数必须是同一类型。Nothing一侧给定,Guid另一侧给定 a,它假定结果类型应该是 a Guid,因此它强制Nothingto 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)
Run Code Online (Sandbox Code Playgroud)

或这个:

Dim myVal2 As Nullable(Of Guid)
myVal2 = If(vendor.Address.ID = Guid.Empty, Nothing, CType(vendor.Address.ID, Nullable(Of Guid)))
Run Code Online (Sandbox Code Playgroud)