函数参数是否总是在 C# 空条件函数调用中计算?
即在以下代码中:
obj?.foo(bar());
如果 obj 为空,是否计算柱线?
规范指定
null_conditional_member_access
表达式E
的形式为P?.A
.让T
成为表达式的类型P.A
。的含义E
确定如下:
[...]
如果
T
是不可为空的值类型,则E
的类型为T?
,并且E
的含义与以下含义相同:((object)P == null) ? (T?)null : P.A
除了
P
只评估一次。否则
E
的类型是T
,E
的含义与以下含义相同:((object)P == null) ? null : P.A
除了 P 只计算一次。
在您的情况下,P
是obj
。A
foo(bar())
.如果我们扩展这两种情况:
((object)obj == null) ? (T?)null : obj.foo(bar())
((object)obj == null) ? null : obj.foo(bar())
根据三元运算符的语义,当obj
为空时,将不计算第三个操作数obj.foo(bar())
。
运行测试代码表明至少在Microsoft编译器中不会计算参数,但是 C# 规范似乎没有将其指定为必需行为。
No.
如果obj
为空,则没有理由评估bar()
。
在dotnetfiddle或elswhere中创建示例,并bar
输出一些东西。不会输出任何内容。