9

我有一个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解析出来的值是稳定的。我在断点处停止,没有其他线程可以操纵这个值。.TextTryParse

请注意使用 M 后缀将常量强制为十进制,因为它是整数,我怀疑存在类型转换问题。

有任何想法吗?

LHS 和 RHS 的值似乎都是稳定且已知的。

--edit-- 一些来自 VS2010 的屏幕截图

单步执行显示 amount3 值的代码

观看对话框和有关变量状态的更多详细信息

4

2 回答 2

1

看看这个类似的问题

在可空类型上使用合并空运算符会更改隐式类型

为什么不做

decimal amount = uxTaxAmount.Value.HasValue ? uxTaxAmount.Value.Value : 0M

鉴于最近的编辑和评论,这不是对原始海报问题的正确答案。

于 2012-08-14T21:43:23.297 回答
1

(这个答案是根据我上面的评论构建的。)

你确定调试器会正确地向你显示这个吗?您是否尝试过进一步降低某些行以确保您具有更新的值amount3

我确定这只是调试器的问题。有时你必须更进一步。也许翻译后的代码 (IL) 有一些优化会混淆调试器(或者我会知道什么)。但是如果没有调试器,值将在您期望的时候准确更新。

我见过其他有经验的开发人员对类似的情况感到困惑,所以我知道调试器在查看对局部变量的赋值时有时会落后“一行代码”。也许有人可以找到讨论这个的链接?

于 2012-08-14T21:51:20.990 回答