C#6 空条件运算符 - 作为代码切换器?
C#6 null-conditional operator - as a code toggler?
我已经知道在执行成员访问之前空条件运算符 can be used to test for null。
例如:
int? length = customers?.Length; // null if customers is null
Customer first = customers?[0];
如果 customers
在 customers?.Length
中为空,则 customers?.Length
将 return 为空,而 null
将在 int? length = ...
变量中
我也知道在多线程环境下方法调用的单个原子操作可以used:
public void OnFoo()
{
Foo?.Invoke(this, EventArgs.Empty);
}
但是
AFAIU - 如果 Foo
是 null
那么
Foo?.Invoke(this, EventArgs.Empty);
也是null
所以我们剩下
public void OnFoo()
{
null; //compilation error
}
所以我问:
问题
似乎 null 条件运算符不仅用于测试 null,如果有,则它会更深入:x?.y?.c?.d
-
但它也像代码切换一样:
像这样:
public void OnFoo()
{
Foo?.Invoke(this, EventArgs.Empty); //Let's assume Foo =null;
}
变成
public void OnFoo()
{
}
我说得对吗?我没有找到这方面的任何文档。
空条件运算符是一个导致 表达式 的运算符 - 它不是 语句 。
你关于 Foo?.Invoke(this, EventArgs.Empty)
等同于 null
的逻辑并不成立,因为它似乎假定了某种不适用的 "template replacement"。
表达式的类型
Foo?.Invoke(this, EventArgs.Empty)
没什么,因为 Invoke
有一个 void
return 类型。你不能写:
// Invalid
var result = Foo?.Invoke(this, EventArgs.Empty);
这就像在 C# 5 规范的 7.6.5 中:
The result of evaluating an invocation-expression is classified as follows:
- If the invocation-expression invokes a method or delegate that returns
void
, the result is nothing. An expression that is classified as nothing is permitted only in the context of a statement-expression (§8.6) or as the body of a lambda-expression (§7.15). Otherwise a binding-time error occurs.
- Otherwise, the result is a value of the type returned by the method or delegate.
成员调用可以使用空条件运算符,此时仅当主表达式的计算结果为非空值时才执行调用。涉及 null 条件运算符的调用表达式的结果与使用常规 .
运算符的结果相同,只是如果结果是不可为 null 的值类型,则使用 null 条件运算符的结果是对应的可空值类型。
当然,当 C# 6 规范发布时,所有这些都会更准确地表达出来——但我不知道那会是什么时候。 (我 认为 目前没有 C# 6 规范。我确定 MS 内部有,但 public 没有。作为 ECMA 标准化过程C# 5 的标准化越来越近,这可能会影响 C# 6 的发布过程。)
我已经知道在执行成员访问之前空条件运算符 can be used to test for null。
例如:
int? length = customers?.Length; // null if customers is null
Customer first = customers?[0];
如果 customers
在 customers?.Length
中为空,则 customers?.Length
将 return 为空,而 null
将在 int? length = ...
变量中
我也知道在多线程环境下方法调用的单个原子操作可以used:
public void OnFoo()
{
Foo?.Invoke(this, EventArgs.Empty);
}
但是
AFAIU - 如果 Foo
是 null
那么
Foo?.Invoke(this, EventArgs.Empty);
也是null
所以我们剩下
public void OnFoo()
{
null; //compilation error
}
所以我问:
问题
似乎 null 条件运算符不仅用于测试 null,如果有,则它会更深入:x?.y?.c?.d
-
但它也像代码切换一样:
像这样:
public void OnFoo()
{
Foo?.Invoke(this, EventArgs.Empty); //Let's assume Foo =null;
}
变成
public void OnFoo()
{
}
我说得对吗?我没有找到这方面的任何文档。
空条件运算符是一个导致 表达式 的运算符 - 它不是 语句 。
你关于 Foo?.Invoke(this, EventArgs.Empty)
等同于 null
的逻辑并不成立,因为它似乎假定了某种不适用的 "template replacement"。
表达式的类型
Foo?.Invoke(this, EventArgs.Empty)
没什么,因为 Invoke
有一个 void
return 类型。你不能写:
// Invalid
var result = Foo?.Invoke(this, EventArgs.Empty);
这就像在 C# 5 规范的 7.6.5 中:
The result of evaluating an invocation-expression is classified as follows:
- If the invocation-expression invokes a method or delegate that returns
void
, the result is nothing. An expression that is classified as nothing is permitted only in the context of a statement-expression (§8.6) or as the body of a lambda-expression (§7.15). Otherwise a binding-time error occurs.- Otherwise, the result is a value of the type returned by the method or delegate.
成员调用可以使用空条件运算符,此时仅当主表达式的计算结果为非空值时才执行调用。涉及 null 条件运算符的调用表达式的结果与使用常规 .
运算符的结果相同,只是如果结果是不可为 null 的值类型,则使用 null 条件运算符的结果是对应的可空值类型。
当然,当 C# 6 规范发布时,所有这些都会更准确地表达出来——但我不知道那会是什么时候。 (我 认为 目前没有 C# 6 规范。我确定 MS 内部有,但 public 没有。作为 ECMA 标准化过程C# 5 的标准化越来越近,这可能会影响 C# 6 的发布过程。)