2012-08-14 50 views
8

我有一个自定义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

Stepping through the code showing the value of amount3

Watch dialog and some more detail about state of variables

+0

CurrencyTextBox(TextBox的子类) – agrath 2012-08-14 21:09:51

+1

它是一个可为空的十进制[decimal?] - 请参阅问题顶部的getter/setter定义 – agrath 2012-08-14 21:13:25

+1

您确定调试器将此信息正确地转发给您吗?你有没有尝试进一步下行,以确保你有'amount3'的更新值?因为当'XXX'是一个可为空的小数时,那么'XXX? 0M'将是一个(不可为空)的小数,如果它是非空的,它将具有“XXX”的值,否则值为零。 – 2012-08-14 21:18:02

回答

0

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

确定调试dsiplays这个正确的你?你有没有尝试进一步下行,以确保你有更新的值amount3

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

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

1

在这个类似的问题,看看

using coalescing null operator on nullable types changes implicit type

为什么不只是做

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

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

+0

原来,这是一个调试问题。我非常担心我的使用?有很多未知的副作用,我必须检查我的所有项目,并确保我更改了语法 – agrath 2012-08-14 21:45:12

+0

另外,.Value是小数? (可空的) – agrath 2012-08-14 21:46:43

+0

哦,我没有做这个连接,因为它的一个可为空的小数,实际值将是Value.Value :) – 2012-08-14 21:48:23