在执行成员访问之前,我已经知道空条件运算符can be used to test为null。C#6空条件运算符 - 作为代码切换器?
例如:
int? length = customers?.Length; // null if customers is null
Customer first = customers?[0];
如果customers
在customers?.Length
为null,则customers?.Length
将返回null和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
}
所以我要问:
问题
似乎空条件运算符不仅用于测试空,如果有,那么它进行更深层次的:x?.y?.c?.d
-
,但它也像代码切换:
像这样:
public void OnFoo()
{
Foo?.Invoke(this, EventArgs.Empty); //Let's assume Foo =null;
}
变为
public void OnFoo()
{
}
对不起,对吗?我没有找到这方面的任何文件。
感谢Jon。但是:_ [如果您可以打印它,或者将其分配给一个变量,则它是一个表达式。如果你不能,这是一个声明](https://www.quora.com/Whats-the-difference-between-a-statement-and-an-expression-in-Python)._。因为我不能通过:var result = Foo?.Invoke(this,EventArgs.Empty);' - 然后根据他的链接,它是一个声明。我的错误在哪里? –
@RoyiNamir:这是关于Python,而不是C#,我怀疑它还是过于简化。你的'var result = ...;'不会编译,因为'Invoke'返回'void' ...我不确定你在问什么。 –
Jon - [我在做梦](https://github.com/ljw1004/csharpspec/blob/gh-pages/CSharp%20Language%20Specification.pdf?raw=true)?请参阅第188页 –