我希望以下内容可以将14D
的值放在变量D3
中。
然而,这种情况并没有发生。
Dim D1 As Decimal = 14D
Dim D2 As Decimal = Nothing
Dim D3 As Decimal
D3 = If(D2 = Nothing, D1, D2)
D3
的最终值为0D
。
为什么D3最终得到的值是0D而不是14D?
答案 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)
确保在调试器和实际应用程序中检查D3的值。例如,试试这个:
Response.Write(D3.ToString())
输出0或14吗?我打赌它输出0.
有时调试器显示错误信息。
如果编译为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
。