了解空合并运算符(??)(Understanding the null coalescing ope

2019-06-27 01:33发布

我有一个自定义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调用返回的预期值,但我得到的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按上述方法使用的getter / setter TryParse是稳定的。我在断点处停止,而且也没有其他线程可以操纵这个值。

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

有任何想法吗?

无论是LHS和RHS的价值似乎是稳定而着称。

- 编辑从VS2010一些screengrabs

Answer 1:

(这个答案是从我的上述评论构造。)

你确定调试dsiplays这个正确的你? 你试过步进一些线进一步回落,以确保你有更新的价值amount3

我敢肯定,这只是与调试器的问题。 有时你必须进一步加强一点。 也许翻译代码(IL)具有一定的优化,混淆调试器(或什么,我会知道)。 但是,如果没有调试器,该值将什么时候你指望它更新。

我见过类似的情况下被混淆其他经验丰富的开发,所以我知道有时调试是“一行代码”的背后看着赋值给一个局部变量的时候。 也许有人可以找到一个链接讨论呢?



Answer 2:

看看这个类似的问题

使用聚结零操作上可空类型改变隐式类型

为什么不只是做

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

这是不正确的答案,考虑到最近的编辑和评论的原始海报的问题。



文章来源: Understanding the null coalescing operator (??)