C# · 12月 29, 2021

C#空传播运算符/条件访问表达式&if blocks

c#-6.0在 c#-6.0出现看起来是一个很方便的功能.但是我很好奇,如果它有助于解决检查子成员是否不为null的问题,然后在if块中的所有子成员上调用布尔方法: public class Container<int>{ IEnumerable<int> Objects {get;set;} } public Container BuildContainer() { var c = new Container(); if (/* Some Random Condition */) c.Objects = new List<int>{1,2,4}; } public void test() { var c = BuildContainer(); //Old way if ( null != c && null != c.Objects && c.Objects.Any()) Console.Write(“Container has items!”); //C# 6 way? if (c?.Object?.Any()) Console.Write(“Container has items!”); }

将c?.Object?.Any()编译?如果传播操作符短路(我认为这是正确的术语)为null,那么你有if(null),这是无效的.

C#团队会解决这个问题吗,或者我缺少null传播运算符的预期用例?

解决方法 它不会这样工作.你可以跳过说明,看下面的代码:)

如你所知 ?.如果子成员为空,操作符将返回null.但是,如果我们尝试获取一个不可空的成员,就像返回bool的Any()方法会发生什么?答案是编译器将“Nullable”中的“返回”值返回.例如,Object?.Any()会给我们bool? (这是Nullable< bool>),而不是bool.

唯一不让我们在if语句中使用这个表达式的东西是它不能被隐式转换为bool.但是你可以明确地做比较,我喜欢比较如下:

if (c?.Object?.Any() == true) Console.Write(“Container has items!”);

Thanks to @DaveSexton还有另一种方法:

if (c?.Object?.Any() ?? false) Console.Write(“Container has items!”);

但对于我来说,与真实的比较似乎更加自然:)