C# 空传播

Dim*_*kos 0 c#

为什么这段代码会抛出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)

https://dotnetfiddle.net/rCbIMj

Han*_*ney 6

这是因为表达式的计算方式:

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

  • 另外,看看编译器如何减少`?.`语法糖:https://sharplab.io/#v2:D4AQTAjAsAUCAMACEEB0AZAlgOwI4G5YQBmZMRAYUQG9ZF7lSQAWRAWQAoBKGuh/lPAD8iAC4BTAB6jEAXkTYArgBtlhGP34A3AIYAnRAC85YqaKGoAygAdlmURwDkAYk ddUAUWXiAtuOyiAIKiAPJ6ACLiAGY6Kg4QXOr8AL589GmMyKwActy8Gpr0giIS0iZKqkmFiLoGkial5la29k6uiRna+ogAniaSnt5+AcFhkTFxHAn46QX0qTDJQA=== (2认同)