4

我已经知道空条件运算符 可用于在执行成员访问之前测试空值。

例如 :

 int? length = customers?.Length; // null if customers is null 
 Customer first = customers?[0];

如果customers是 null in customers?.Length ,那么customers?.Length 将返回 null 并且null将在int? length = ...变量中

我也知道它可以用于多线程环境中方法调用的单个原子操作:

public void OnFoo()
{
    Foo?.Invoke(this, EventArgs.Empty);
}

AFAIU - 如果Foonull那么

 Foo?.Invoke(this, EventArgs.Empty);

也是null

所以我们只剩下

public void OnFoo()
{
    null; //compilation error
}

所以我问:

问题

似乎空条件运算符不仅用于测试空,如果有,那么它会更深入: x?.y?.c?.d -

但它也像代码切换一样:

像这样:

  public void OnFoo()
    {
        Foo?.Invoke(this, EventArgs.Empty); //Let's assume Foo =null;
    }

变成

  public void OnFoo()
    {

    }

我对吗?我没有找到这方面的任何文档。

4

1 回答 1

6

null 条件运算符是一个产生表达式的运算符- 它不是一个语句

Foo?.Invoke(this, EventArgs.Empty)您关于等同于的逻辑null并不真正成立,因为它似乎假设了一种不适用的“模板替换”。

表达式的类型

Foo?.Invoke(this, EventArgs.Empty)

什么都不是,因为Invoke有一个void返回类型。你不能写:

// Invalid
var result = Foo?.Invoke(this, EventArgs.Empty);

这就像在 C# 5 规范的 7.6.5 中一样:

对调用表达式求值的结果分类如下:

  • 如果调用表达式调用返回的方法或委托void,则结果为空。只有在语句表达式(第 8.6 节)的上下文中或作为 lambda 表达式的主体(第 7.15 节)的上下文中才允许被归类为无的表达式。否则会发生绑定时错误。
  • 否则,结果是方法或委托返回的类型的值。

成员调用可以使用空条件运算符,此时仅当主表达式计算为非空值时才执行调用。涉及空条件运算符的调用表达式的结果与使用常规.运算符的结果相同,除了如果结果是不可为空的值类型,则使用空条件运算符的结果是相应的可空值类型.

当然,当 C# 6 规范出来时,所有这些都会更准确地表达出来——但我不知道什么时候会出现。(我认为目前没有 C# 6 规范。我确信 MS 内部有一个,但不是公开的。随着 ECMA 标准化过程越来越接近标准化 C# 5,这可能会影响发布C# 6 的过程。)

于 2016-08-22T08:23:18.173 回答