是否在 C# 空条件函数调用中计算函数参数?



函数参数是否总是在 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的类型是TE的含义与以下含义相同:

    ((object)P == null) ? null : P.A
    

    除了 P 只计算一次。

在您的情况下,PobjAfoo(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输出一些东西。不会输出任何内容。

最新更新