【问题标题】:null-propagating operator returning bool空传播运算符返回 bool
【发布时间】:2019-12-02 09:37:10
【问题描述】:

我有一个返回布尔值的“Func<bool> Filter”委托。但是,我的班级的用户不需要提供这个,如果没有提供,默认值应该是 true。但是,如果过滤器为空,则结果等于 false。我不确定为什么。我认为该声明基本上不会导致任何事情发生,并且仍然是正确的。如果可能的话,我错过了什么以及如何使用这种速记方式来做到这一点。我知道我可以用不同的方式写出来,但我正在尝试用这种新的速记方式来理解这个想法。

bool? result = true;
result = h.Filter?.Invoke(args);  // IF Filter IS NULL THIS LINE TURNS result TO FALSE

if (result != null || result == true)
{
    yield return h.Callback(args);

    h.Post?.Invoke(args);
}

【问题讨论】:

  • 不可能是result == false。这不是这里发生的事情。如果你测试result.HasValue,你会得到false
  • if(result ?? true)

标签: c#


【解决方案1】:

我认为您误解了您的代码的作用。具体来说,你的 if 语句。

h.Filternull 时,您实际上是在将null 分配给结果:

bool? result = null;

现在,如果我们要测试您的“真实”陈述,我们会看到:

Console.WriteLine("!= null: {0}", result != null); // != null: false
Console.WriteLine("== true: {0}", result == true); // == true: false

所以你的条件不满足。

看来你真正想要的是这个(== null,而不是!= null):

if (result == null || result == true)

可以更简洁地写成:

if (result.GetValueOrDefault(true))

【讨论】:

  • GetValueOrDefault() 是我所需要的!感谢那。你是对的,但奇怪的是 VS 悬停在结果上时说它是假的,但深入挖掘你是正确的 HasValue 是假的,但值为空。有趣的是,悬停只会像那样说假。考虑到悬停在布尔值上有点误导,即使可以为空,您也会希望编辑器向您显示它的值而不是我猜的 HasValue 值。再次感谢您!
  • @user441521 这可能是调试器的错误。您可以使用 Visual Studio 窗口右上角的快速启动框左侧的按钮向 Microsoft 报告。
猜你喜欢
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2014-09-17
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多