【发布时间】:2018-12-06 18:58:39
【问题描述】:
当目标对象在条件成员访问/空传播运算符中为空,并且该成员是一个方法时,是否评估该方法的参数?
也就是说,在下面的代码中,是不是调用了g()?
SomeClass x = null;
x?.Foo(g());
h() 怎么样:
SomeClass x = null;
x?.Bar($"h = {h()}");
SharpLab 将参数评估放在 if 块中,因此将被跳过。但这是否由规范或实现细节保证?
【问题讨论】:
-
您可以只运行您已经编写的代码并快速确定是否实际调用了该方法。如果您想知道规范中关于该主题的内容,请阅读规范。
-
为什么不自己试试呢?
-
But is this guaranteed by the specification or an implementation detail?(除了 HimBromBeere 的回答)查看 C# 6.0 规范草案:docs.microsoft.com/en-us/dotnet/csharp/language-reference/… 您要查找的是“空条件运算符”部分的末尾。 -
@Servy:我确实运行了导致最后一段的代码。
-
@Servy:我很高兴 engonzo 提供了指向规范正确段落的链接,因为规范自己的目录没有,而且我永远不会考虑寻找 null-在关于一元运算符的部分中传播成员访问,这绝对是一个二元运算符。
标签: c# short-circuiting side-effects null-propagation-operator