.NET内联如果三元运算符返回意外的十进制值

.NET内联如果三元运算符返回意外的十进制值,.net,vb.net,if-statement,.net,Vb.net,If Statement,我希望以下操作会导致14D的值被放入变量D3 然而,这并没有发生 Dim D1 As Decimal = 14D Dim D2 As Decimal = Nothing Dim D3 As Decimal D3 = If(D2 = Nothing, D1, D2) D3的最终值为0D 在调试器中,“0D=nothing”将求值为true 在调试器中,“If(D2=Nothing,D1,D2)”的计算结果为14D 这是ASP.NET代码隐藏文件中的.NET Framework 4.0

我希望以下操作会导致
14D
的值被放入变量
D3

然而,这并没有发生

Dim D1 As Decimal = 14D
Dim D2 As Decimal = Nothing
Dim D3 As Decimal

D3 = If(D2 = Nothing, D1, D2)

D3的最终值为
0D

  • 在调试器中,“0D=nothing”将求值为true
  • 在调试器中,“If(D2=Nothing,D1,D2)”的计算结果为14D
  • 这是ASP.NET代码隐藏文件中的.NET Framework 4.0

为什么D3最终的值是0D而不是14D?

更新#1
  • 请注意,在调试器监视窗口中,D3显示的值为0D。但是,如果我使用response.write(D3.ToString())将D3的值输出到屏幕,则D3的值是正确的
选项1(最有可能) 确保您正在调试器和实际应用程序中检查D3的值。例如,尝试以下方法:

Response.Write(D3.ToString())
它的输出是0还是14?我打赌它输出0

有时调试器显示错误信息

选择2 如果您编译到x86而不是x64,它就可以正常工作。或者,您可以使用
如果D2=Nothing,那么D3=D1,否则D3=D2
。事实上,
D3=If(True,D1,D2)
失败。即使D2未分配任何内容,它也会失败。如果D2被分配1D,D3仍然被分配0D。必须是编译器错误。

选项1(最有可能) 确保您正在调试器和实际应用程序中检查D3的值。例如,尝试以下方法:

Response.Write(D3.ToString())
它的输出是0还是14?我打赌它输出0

有时调试器显示错误信息

选择2 如果您编译到x86而不是x64,它就可以正常工作。或者,您可以使用
如果D2=Nothing,那么D3=D1,否则D3=D2
。事实上,
D3=If(True,D1,D2)
失败。即使D2未分配任何内容,它也会失败。如果D2被分配1D,D3仍然被分配0D。必须是编译器错误。

选项1(最有可能) 确保您正在调试器和实际应用程序中检查D3的值。例如,尝试以下方法:

Response.Write(D3.ToString())
它的输出是0还是14?我打赌它输出0

有时调试器显示错误信息

选择2 如果您编译到x86而不是x64,它就可以正常工作。或者,您可以使用
如果D2=Nothing,那么D3=D1,否则D3=D2
。事实上,
D3=If(True,D1,D2)
失败。即使D2未分配任何内容,它也会失败。如果D2被分配1D,D3仍然被分配0D。必须是编译器错误。

选项1(最有可能) 确保您正在调试器和实际应用程序中检查D3的值。例如,尝试以下方法:

Response.Write(D3.ToString())
它的输出是0还是14?我打赌它输出0

有时调试器显示错误信息

选择2
如果您编译到x86而不是x64,它就可以正常工作。或者,您可以使用
如果D2=Nothing,那么D3=D1,否则D3=D2
。事实上,
D3=If(True,D1,D2)
失败。即使D2未分配任何内容,它也会失败。如果D2被分配1D,D3仍然被分配0D。必须是编译器错误。

十进制是一种值类型,实际上不能等于零。将值类型设置为Nothing将导致它接受其默认值(在本例中为0D)

这里有一个可行的解决方案:

Dim D1 As Decimal = 14D
Dim D2 As Decimal = Nothing
Dim D3 As Decimal

D3 = If(D2 = CType(Nothing, Decimal), D1, D2)
这在C#中要干净得多:


Decimal是一种值类型,实际上不能等于零。将值类型设置为Nothing将导致它接受其默认值(在本例中为0D)

这里有一个可行的解决方案:

Dim D1 As Decimal = 14D
Dim D2 As Decimal = Nothing
Dim D3 As Decimal

D3 = If(D2 = CType(Nothing, Decimal), D1, D2)
这在C#中要干净得多:


Decimal是一种值类型,实际上不能等于零。将值类型设置为Nothing将导致它接受其默认值(在本例中为0D)

这里有一个可行的解决方案:

Dim D1 As Decimal = 14D
Dim D2 As Decimal = Nothing
Dim D3 As Decimal

D3 = If(D2 = CType(Nothing, Decimal), D1, D2)
这在C#中要干净得多:


Decimal是一种值类型,实际上不能等于零。将值类型设置为Nothing将导致它接受其默认值(在本例中为0D)

这里有一个可行的解决方案:

Dim D1 As Decimal = 14D
Dim D2 As Decimal = Nothing
Dim D3 As Decimal

D3 = If(D2 = CType(Nothing, Decimal), D1, D2)
这在C#中要干净得多:


Decimal
,就像其他数值类型(不是引用类型,比如对象/类)一样,默认值为0。不能为它们分配
任何内容
,因为值类型一旦声明就存在

如果要将值类型设置为nothing,则必须通过以下方式之一将其声明为
Nullable

Dim d1 As Nullable(Of Decimal) = Nothing


问号是第一个示例的缩写。

十进制
,就像其他数值类型(不是引用类型,比如对象/类)默认为0一样。不能为它们分配
任何内容
,因为值类型一旦声明就存在

如果要将值类型设置为nothing,则必须通过以下方式之一将其声明为
Nullable

Dim d1 As Nullable(Of Decimal) = Nothing


问号是第一个示例的缩写。

十进制
,就像其他数值类型(不是引用类型,比如对象/类)默认为0一样。不能为它们分配
任何内容
,因为值类型一旦声明就存在

如果要将值类型设置为nothing,则必须通过以下方式之一将其声明为
Nullable

Dim d1 As Nullable(Of Decimal) = Nothing


问号是第一个示例的缩写。

十进制
,就像其他数值类型(不是引用类型,比如对象/类)默认为0一样。不能为它们分配
任何内容
,因为值类型一旦声明就存在

如果要将值类型设置为nothing,则必须通过以下方式之一将其声明为
Nullable

Dim d1 As Nullable(Of Decimal) = Nothing


问号是第一个示例的缩写。

您的代码按原样工作


但通常我会使用
IsNothing(D2)
而不是
D2=Nothing

您的代码按原样工作

但通常我会使用
IsNothing(D2)
和not
D2=Nothing