gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:52:28 24 4
gpt4 key购买 nike

Null propagating operator / Conditional access expression进来了看起来像一个非常方便的功能。但我很好奇它是否有助于解决检查子成员是否不为空然后在 if block 内对所述子成员调用 bool 方法的问题:

  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,运算符将返回 null。但是如果我们尝试获取一个不可为空的成员,比如 Any(),会发生什么?方法,返回 bool ?答案是编译器会将返回值“包装”在Nullable<> 中。 .例如,Object?.Any()会给我们bool? (这是 Nullable<bool> ),而不是 bool .

唯一不允许我们在 if 中使用此表达式的东西声明是它不能隐式转换为 bool .但是您可以明确地进行比较,我更喜欢与 true 进行比较像这样:

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

Thanks to @DaveSexton还有一种方法:

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

但是对于我来说,与true相比看起来更自然:)

关于C# 空传播运算符/条件访问表达式和 if block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com