为什么这段代码会抛出ArgumentNullException
:
string text = null;
var x = text?.Split('#');
var y = x.ElementAtOrDefault(1);
Run Code Online (Sandbox Code Playgroud)
但这并没有:
string text = null;
var z = text?.Split('#').ElementAtOrDefault(1);
Run Code Online (Sandbox Code Playgroud)
在第一个片段中,我必须使用空传播运算符?
:
string text = null;
var x = text?.Split('#');
var y = x?.ElementAtOrDefault(1);
Run Code Online (Sandbox Code Playgroud)
但在第二种情况下不需要这样做:
var z = text?.Split('#')?.ElementAtOrDefault(1);
Run Code Online (Sandbox Code Playgroud)
这是因为表达式的计算方式:
string text = null; // text is null
var x = text?.Split('#'); // x is null
var y = x.ElementAtOrDefault(1); // null.ElementAtOrDefault throws an NRE
Run Code Online (Sandbox Code Playgroud)
与你的另一个例子:
string text = null; // text is null
var z = text?.Split('#').ElementAtOrDefault(1); // z is null, nothing past ?. is evaluated because text was null
Run Code Online (Sandbox Code Playgroud)
从根本上来说,空传播运算符将其转换为:
Something?.SomethingElse(...)
Run Code Online (Sandbox Code Playgroud)
对于这个三元运算:
Something == null ? null : Something.SomethingElse(...)
Run Code Online (Sandbox Code Playgroud)
因此,?.
当变量为 时,经过运算符的执行将被短路(不执行)null
。
归档时间: |
|
查看次数: |
93 次 |
最近记录: |