我有一个自定义WebControl
它实现了一个.Value
的getter/setter返回可空<小数>了解空合并运算符(?)
这是一个客户端过滤文本框(的TextBox
一个子类与包含的JavaScript和用于设置/获取的值)
这里一些服务器侧逻辑是吸气&从控制装定:
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;
我看到的量被设定为“0”时,uxAmount.Value
收益10000
这个工作如我所料(借口在外壳的变化):
decimal? _Amount = uxAmount.Value;
decimal amount = _Amount ?? 0;
我也看到了这种行为(最近)调用与空合并运算符一起在LINQ2SQL数据上下文定义的UDF功能时,这是我知道返回预期我的UDF调用价值,但我是ge改为RHS值。
更令我困惑的是,如果我在手表中评估uxAmount.Value,我会得到10000的Nullable<decimal>
。
这里有一些表情我已经试过:
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,但值为uxAmount.Value
(解析出.Text
根据上述获得者/设置者使用TryParse
是稳定的。我停在断点处,没有其他线程可以操纵这个值。
请注意,使用M后缀强制常数为十进制,因为它是整数,我怀疑是类型转换的问题。
任何想法?
LHS和RHS的价值似乎是稳定的和已知的。
- 编辑一些screengrabs从VS2010
CurrencyTextBox(TextBox的子类) – agrath 2012-08-14 21:09:51
它是一个可为空的十进制[decimal?] - 请参阅问题顶部的getter/setter定义 – agrath 2012-08-14 21:13:25
您确定调试器将此信息正确地转发给您吗?你有没有尝试进一步下行,以确保你有'amount3'的更新值?因为当'XXX'是一个可为空的小数时,那么'XXX? 0M'将是一个(不可为空)的小数,如果它是非空的,它将具有“XXX”的值,否则值为零。 – 2012-08-14 21:18:02