DateTime? date = null;
string tmp = "a" + "(" + date ?? "blablabla" + ")";
Console.WriteLine(tmp);
这将打印出接近于:'a ('
.
这是一个错误null-coalescing operator
吗?如果我放在date ?? "blablabla"
括号中,则会在错误中加下划线。
DateTime? date = null;
string tmp = "a" + "(" + date ?? "blablabla" + ")";
Console.WriteLine(tmp);
这将打印出接近于:'a ('
.
这是一个错误null-coalescing operator
吗?如果我放在date ?? "blablabla"
括号中,则会在错误中加下划线。
空合并运算符 ??
的优先级低于+
运算符,因此您的代码等于
string tmp = ("a" + "(" + date) ?? ("blablabla" + ")");
由于+
字符串操作中的所有内容都会生成字符串(通过调用.ToString()
所有非字符串操作数),因此您的代码将始终生成"a("
字符串。
首先,您应该始终假设这是您的错,而不是编译器的错;select
没有坏。你真的认为??
操作符的 Visual Studio 2010 实现没有经过实战测试吗?当您遇到与您的期望不符的事情时,请检查您的期望。拿出手册,并确保你完全理解假设会发生什么。在这种情况下,请打开语言规范。
如果您继续阅读规范的第 1.4 节,您将看到一个将运算符分组为优先级分组的表格;你也可以在网上找到它。特别是,空合并运算符??
位于底部附近,仅高于低条件三元运算符和赋值和=>
。它低于加法运算符。因此,您的陈述
string tmp = "a" + "(" + date ?? "blablabla" + ")";
被编译器视为
string tmp = (("a" + "(" + date) ?? ("blablabla" + ")"));
我不会完全迂腐,也不会在第一个加法表达式1中加上括号。由于该语句中表达式的左侧永远不会为空,因此它当然总是将"a("
(或"a("
+date.ToString()
当date.HasValue
为真时)分配给tmp
.
要点是您对应该发生的事情有错误的期望,您应该根据手册进行验证。
如果我放在
date ?? "blablabla"
括号中,则会在错误中加下划线。
当然是。您甚至阅读了错误消息吗?它可能会告诉您,您不能??
在 aDateTime?
和 a上执行操作,因为在任何一个方向string
之间都没有隐式转换。这也包含在语言规范中;见第 7.13 节。您必须阅读此消息并做出回应。要获得与您要表达的内容在语义上等效的内容,您必须求助于条件三元运算符:DateTime?
string
date.HasValue ? date.ToString() : "blablabla"
然后将整个内容放在括号中,因为条件三元运算符的优先级很低。
最后,我发现您的代码的正确括号版本相当丑陋,阅读起来并不有趣,而且维护起来可能也不愉快。简单点,拜托:
var tmp = String.Format("a({0})",
date.HasValue ? date.ToString() : "blablabla");
现在很清楚正在发生什么以及将要发生什么。我不需要思考就能理解它。把你的想法留到你将遇到的困难问题上。
1:小心。date.ToString
在尝试正确确定首先评估的内容之前,我们需要添加一个方法调用(具有最高优先级)。
这里只是另一个版本:
DateTime? date = null;
string tmp = string.Format("a({0})",
date.HasValue ? date.ToString() : "blablabla");
我真的很喜欢string.Format
而不是串联。
"blablabla"
不是日期,所以你不能使用 is 来设置一个date?
.
string tmp = "a" + "(" + date ?? "blablabla" + ")";
相当于
string tmp = ("a" + "(" + date) ?? ("blablabla" + ")");
这就是你a(
的来源。
然而
string tmp = "a" + "(" + (date ?? DateTime.Now) + ")";
或类似的应该工作。
这不是空合并运算符的错误。
它的运算符优先级:
"a" + "(" + date ?? "blablabla" + ")"
是相同的:
("a" + "(" + date.ToString() ) ?? ( "blablabla" + ")" )
并且("a" + "(" + date.ToString() )
不为空。
这很可能是因为date
is 不是字符串,并且??
运算符无法确定 and 的通用基本date
类型"blablabla"
。试试(date.ToString() ?? "blablabla")
。但这也不能满足您的需求,因为date.ToString()
永远不会null
。
string tmp = "a" + "(" + (date ?? DateTime.Now) + ")";
应该管用。