【问题标题】:Safe Navigation of indexed objects索引对象的安全导航
【发布时间】:2014-09-04 16:47:55
【问题描述】:

随着 Roslyn 的引入,C# 获得了安全导航运算符的好处。 这对于使用点符号的对象来说非常棒,例如

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

在这种情况下,myClass 为空,但安全运算符将我从异常中拯救出来。

我的问题是,如果您有一个索引对象,是否有安全导航运算符的等效实现?需要这个的示例如下所示:

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

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

因为这是一个数组,我可以通过以下方式使用安全导航运算符,但这不适用于其他集合,例如 Lists 和 DataRows

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

【问题讨论】:

  • 只是补充一下,Safe Navigation 这个词有点误导,因为操作员只从null 对象中保存。因此名称为Null propagation operator。这不会在IndexOutOfRangeException 的情况下保存,例如MyClass myClass = new MyClass { ArrayOfStrings = new string[2] }; var singleElement = myClass?.ArrayOfStrings?[5];

标签: c# operators roslyn c#-6.0


【解决方案1】:

基于Language Feature Status Page,它看起来像你想要的:

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

页面上的例子是:

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

... 诚然,$price 部分现在已被撤回,我相信,但我希望索引空传播能够工作。

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2013-06-08
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多