了解空合并运算符(??)

我有一个自定义WebControl ,它实现了一个返回Nullable <decimal>的.Value getter / setter

它是一个客户端过滤的文本框(包含JavaScript的TextBox的子类和用于设置/获取值的一些服务器端逻辑)

这是来自该控件的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,但uxAmount.Value (根据上面的getter / setter使用TryParse解析出.Text的值是稳定的。我停在断点处,并且没有其他线程可以操纵这个值。

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

有任何想法吗?

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

- 编辑 - 来自VS2010的一些屏幕抓图

浏览显示amount3值的代码

观看对话框以及关于变量状态的更多细节


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

你确定调试器能正确地把你的这个东西给你吗? 您是否尝试了更多步骤以确保您拥有amount3的更新值?

我确定这只是调试器的一个问题。 有时你需要进一步探索。 也许翻译的代码(IL)有一些优化会混淆调试器(或我所知道的)。 但是如果没有调试器,该值将在您期望的时候更新。

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


看看这个类似的问题

在可空类型上使用合并空操作符会改变隐式类型

为什么不做呢

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

根据最近的编辑和评论,这不是解决原始海报问题的正确答案。

链接地址: http://www.djcxy.com/p/57961.html

上一篇: Understanding the null coalescing operator (??)

下一篇: using coalescing null operator on nullable types changes implicit type