我有一个WebControl
实现.Value
返回 Nullable<decimal> 的 getter/setter的自定义
这是一个客户端过滤的文本框(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 函数以及空合并运算符时,我也看到了这种行为(最近),也就是说,我知道我的 UDF 调用返回了预期值,但我得到的是 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,但是(根据上面的 getter/setter 使用 auxAmount.Value
解析出来的值是稳定的。我在断点处停止,没有其他线程可以操纵这个值。.Text
TryParse
请注意使用 M 后缀将常量强制为十进制,因为它是整数,我怀疑存在类型转换问题。
有任何想法吗?
LHS 和 RHS 的值似乎都是稳定且已知的。
--edit-- 一些来自 VS2010 的屏幕截图