pau*_*doo 8 c# logic operator-keyword
??C#中的运算符在评估时是否使用短路?
var result = myObject ?? ExpressionWithSideEffects();
Run Code Online (Sandbox Code Playgroud)
如果myObject为非null,ExpressionWithSideEffects()则不使用结果,但会ExpressionWithSideEffects()完全跳过?
小智 10
是的,它确实是短路的.
这是在LinqPad中测试的片段:
string bar = "lol";
string foo = bar ?? string.Format("{2}", 1);
foo.Dump();
bar = null;
foo = bar ?? string.Format("{2}", 1);
foo.Dump();
Run Code Online (Sandbox Code Playgroud)
第一个coalesce工作时没有抛出异常而第二个抛出异常(格式字符串无效).
是的,它确实.与以往一样,C#语言规范是最终的来源1.
从C#3规范,第7.12节(v3而不是4,因为v4规范进入动态细节,这里没有真正相关):
表达式的类型
a ?? b取决于操作数类型之间可用的隐式转换.按优先顺序排列,类型为?? b是A0,A或B,其中A是a的类型,B是b的类型(假设b具有类型),如果A是可空类型,则A0是A的基础类型,否则A .具体来说,a ?? b处理如下:
- 如果A不是可空类型或引用类型,则会发生编译时错误.
- 如果A是可空类型,并且从b到A0存在隐式转换,则结果类型为A0.在运行时,首先评估a.如果a不为null,则打开a以键入A0,这将成为结果.否则,b被评估并转换为类型A0,这就成了结果.
- 否则,如果从b到A存在隐式转换,则结果类型为A.在运行时,首先计算a.如果a不为null,则a成为结果.否则,b被评估并转换为类型A,这就是结果.
- 否则,如果b具有类型B并且存在从A0到B的隐式转换,则结果类型为B.在运行时,首先计算a.如果a不为null,则打开a以键入A0(除非A和A0是相同的类型)并转换为类型B,这将成为结果.否则,b被评估并成为结果.
- 否则,a和b不兼容,并发生编译时错误.
第二,第三和第四子弹是相关的子弹.
1有到过一下你碰巧使用是编译器是否是一个哲学讨论实际真理的来源......是什么它是一种语言的真理的意思做或者什么它目前做?