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

时间:2014-06-13 03:41:03

标签: .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”评估为真
  • 在调试器中,“If(D2 = Nothing,D1,D2)”评估为14D
  • 这是ASP.NET代码隐藏文件中的.NET Framework 4.0。


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

更新#1

  • 请注意,在调试器监视窗口中,D3显示的值为0D。但是,如果我使用response.write(D3.ToString())将D3的值输出到屏幕,则D3的值是正确的。

4 个答案:

答案 0 :(得分:2)

Decimal是一种值类型,实际上不能等于Nothing。将值类型设置为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 d1 = 14m;
decimal d2 = default(decimal);
decimal d3;

d3 = (d2 == default(decimal)) ? d1 : d2;

答案 1 :(得分:1)

选项1(最有可能)

确保在调试器和实际应用程序中检查D3的值。例如,试试这个:

Response.Write(D3.ToString())

输出0或14吗?我打赌它输出0.

有时调试器显示错误信息。

选项2

如果编译为x86而不是x64,它将正常工作。或者,您可以使用If D2 = Nothing Then D3 = D1 Else D3 = D2。事实上,D3 = If(True, D1, D2)失败了。即使D2没有被分配,它也会失败。如果D2被指定为1D,则D3仍然被指定为0D。必须是编译器错误。

答案 2 :(得分:0)

Decimal,就像其他数值类型(不是引用类型,如对象/类)一样,默认为0.它们不能分配Nothing,因为值类型一旦声明就存在。< / p>

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

Dim d1 As Nullable(Of Decimal) = Nothing

或者

Dim d2 As Decimal? = Nothing

问号是第一个例子的简写。

答案 3 :(得分:0)

您的代码按原样运行。

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