这是Visual Studio 2010编译器中的错误吗?

kul_mi
DateTime? date = null;
string tmp = "a" + "(" + date ?? "blablabla" + ")";

Console.WriteLine(tmp);

这将打印出接近于的内容'a ('

这是一个错误null-coalescing operator吗?如果我date ?? "blablabla"在括号中加了下划线,则为错误。

杰森

首先,您应该始终假设这是您的,而不是编译器的错;select没有坏老实说,您是否认为??尚未操作员进行Visual Studio 2010的实战测试?当您遇到与您的期望不符的事情时,请检查您的期望。走出手册,并确保明白究竟什么是假设发生。在这种情况下,请打开语言规范。

如果继续执行规范的§1.4 ,您将看到一个表,该表将运算符分组为优先级分组。您也可以在网上找到它特别是,空合并运算符??位于底部附近,仅在条件较低的三元运算符和赋值和之上=>在加法运算符下面因此,您的陈述

string tmp = "a" + "(" + date ?? "blablabla" + ")";

被编译器视为

string tmp = (("a" + "(" + date) ?? ("blablabla" + ")"));

我将不会完全学究,不要在第一个加法表达式1上加上括号由于该语句中表达式的左侧永远不会为null,因此,它始终总是"a("(或"a("+,date.ToString()date.HasValue为true时)赋值tmp

主要的一点是,有一个不正确的期待,什么应该发生的是,你应该对手册已经验证。

如果我date ?? "blablabla"在括号中加了下划线,则为错误。

当然如此。您是否还阅读了错误消息?它可能会告诉您,您不能??在“ a”DateTime?和“ a”上进行操作string因为在这两个方向之间DateTime?之间都没有隐式转换string语言规范也涵盖了这一点。参见第7.13节。您必须阅读此消息并做出响应要得到的东西在语义上等同于你在做什么表达的,你就必须诉诸有条件的三元运算符:

date.HasValue ? date.ToString() : "blablabla"

然后将整个内容包装在括号中,因为条件三元运算符的优先级非常低。

最后,我发现代码的正确括号括起来很丑陋,阅读起来并不有趣,并且维护起来可能很不愉快。只是简单一点,请:

var tmp = String.Format("a({0})", 
                       date.HasValue ? date.ToString() : "blablabla");

现在,它是如此清楚是怎么回事,什么事情发生。我不必去想了解它。将您的想法保存在遇到的困难问题上。

1:小心。date.ToString在尝试正确找出首先要评估的内容之前,我们需要添加对的方法调用(优先级最高)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章