.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的值是正确的李>
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)
和notD2=Nothing