我有一个自定义的WebControl
,它实现了一个.Value
获取器/设置器,返回一个可空的<decimal>。
这是一个客户端过滤的文本框(一个TextBox
的子类,包含JavaScript和一些服务器端逻辑来设置/获取值)。
下面是这个控件的getter和setter:
public decimal? Value
{
get
{
decimal amount = 0;
if (!decimal.TryParse(this.Text, NumberStyles.Currency, null, out amount))
{
return null;
}
else
{
return amount;
}
}
set
{
if (!value.HasValue)
{
this.Text = "";
}
else
{
this.Text = string.Format("${0:#,##0.00}", value);
}
}
}
我看到的问题是,这个语句的输出是:
decimal Amount = uxAmount.Value ?? 0M;
当uxAmount.Value
返回10000时,我看到金额被设置为“0”。
这符合我的预期(请原谅大小写的更改):
decimal? _Amount = uxAmount.Value;
decimal amount = _Amount ?? 0;
最近我在调用一个定义在Linq2Sql数据上下文中的UDF函数时,遇到了这种行为,同时还使用了null合并运算符。也就是说,我知道我的UDF调用返回了预期的值,但我却得到了RHS值。
更令我困惑的是,如果我在观察窗口中评估uxAmount.Value,我会得到类型为Nullable<decimal>
的10000。
以下是我尝试过的一些表达式:
decimal? _Amount = uxAmount.Value; //10000
decimal amount = _Amount ?? 0; //10000
decimal amount2 = _Amount ?? 0M; //10000
decimal Amount = uxAmount.Value ?? 0M; //0
然后,我在上述4个表达式后添加了这个表达式。
decimal amount3 = (uxTaxAmount.Value) ?? 0M;
现在
decimal Amount = uxAmount.Value ?? 0M; //10000
decimal amount3 = (uxAmount.Value) ?? 0M; //0
似乎最后一个调用总是0,但根据上面的getter/setter使用TryParse解析出来的uxAmount.Value(从.Text中解析出来)的值是稳定的。我在断点处停止了,没有其他线程可以操作这个值。
请注意使用M后缀将常量强制为十进制,因为它是整数,我怀疑存在类型转换问题。
有什么想法吗?
左右两边的值似乎都是稳定的且已知。
--编辑--从VS2010中获取一些屏幕截图
查看下面关于变量状态的对话框以及更多详细信息
amount3
值了吗?因为当XXX
是可空十进制数时,XXX ?? 0M
将是一个(非可空)十进制数,如果XXX
不为空,则其值将为XXX
,否则为零。 - Jeppe Stig Nielsen