2014-09-04 36 views
3

随着Roslyn的推出,C#受益于安全导航运算符。 对于使用点符号的对象来说,这非常棒。索引对象的安全导航

MyClass myClass = null; 
var singleElement = myClass?.ArrayOfStrings[0]; 

在这个实例中,myClass为null,但安全操作符将我从异常中解救出来。  

我的问题是如果你有一个索引对象是否有一个等效的安全导航操作符的实现?需要这个应该是这样的一个例子:

var myClass2 = new MyClass { ArrayOfStrings = null }; 
var singleElement2 = myClass2?.ArrayOfStrings[0]; 

在这种情况下myClass2不为空,但ArrayOfStrings属性,所以当我尝试和访问它,它会抛出异常。由于ArrayOfStrings和索引之间没有点符号,因此我无法添加安全导航运算符。  

因为这是一个数组,我可以使用以下方式安全导航操作,但这并不对其他的集合,如基于它看起来像Language Feature Status Page列表和数据行

var myClass3 = new MyClass { ArrayOfStrings = null }; 
var singleElement3 = myClass3?.ArrayOfStrings?.GetValue(0); 
+1

只是添加,术语'安全导航“有点误导,因为操作符只从'null'对象保存。因此,名称[空传播运算符](https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status&referringTitle=Documentation)。如果像'MyClass myClass = new MyClass {ArrayOfStrings = new string [2]}这样的'IndexOutOfRangeException',这将不会保存。 var singleElement = myClass?.ArrayOfStrings?[5];' – Habib 2014-09-05 15:02:04

回答

8

工作你想:

var singleElement2 = myClass2?.ArrayOfStrings?[0]; 

页面上的例子是:

customer?.Orders?[5]?.$price 

......坦率地说$price部分现在已经被撤消,我相信,但我会期待索引空传播起作用。

+0

辉煌,这正是我所期待的,谢谢。 – rh072005 2014-09-04 16:55:57