C# 正在查找布尔语句的解释

C# 正在查找布尔语句的解释,c#,boolean,C#,Boolean,我在我正在使用的一个库中找到了这个语句。它应该检查集群中的当前节点是否为前导节点。下面的语句是:(!(cluster.Leader?.IsRemote??true)) 为什么不直接使用(cluster.Leader?.IsRemote)?(忽略!接线员,我知道它是如何工作的) 这个方法有什么好处吗?< /P> < P>这意味着,如果 Copy.Sudio.IsRead 是 null ,那么考虑是否是真的?正确 有效null??真等于真 因此,如果您的leader为null,则整个语句将返回fal

我在我正在使用的一个库中找到了这个语句。它应该检查集群中的当前节点是否为前导节点。下面的语句是:
(!(cluster.Leader?.IsRemote??true))

为什么不直接使用
(cluster.Leader?.IsRemote)
?(忽略!接线员,我知道它是如何工作的)


这个方法有什么好处吗?< /P> < P>这意味着,如果<代码> Copy.Sudio.IsRead 是<代码> null <代码>,那么考虑是否是真的<代码>?正确

有效
null??真
等于


因此,如果您的
leader
为null,则整个语句将返回false)。没有
??null
您的语句甚至无法编译,因为
!空值
不表示任何内容。

请考虑以下代码:

public class Foo
{
    public bool IsBar { get; set; }
}

var foo = new Foo();

Console.WriteLine(!(foo?.IsBar ?? true));
IsBar
声明为常规的、不可为空的bool时,
foo?.IsBar
中的
运算符使该表达式的类型为
bool?
,而不是
bool

您不能在布尔表达式中使用可为null的布尔值,请参见,因此您需要使表达式显式化:如果
foo
,因此
foo?。IsBar
null

这就是
??正确
输入。备选方案:

Console.WriteLine(!(foo?.IsBar).GetValueOrDefault(true));
Console.WriteLine(foo?.IsBar == false);
让我们为您构建一个真理表

构造(请注意,我们需要考虑三个值:
true
false
null
):


让我们考虑下面的代码

class Program
{
    static void Main(string[] args)
    {
        Cluster cluster = new Cluster { Leader = null };
        var libresult = (!(cluster.Leader?.IsRemote ?? true));
        var result = (!(cluster.Leader?.IsRemote));
    }

}

class Cluster
{
   public Leader Leader { get; set; }
}

class Leader
{
    public bool IsRemote { get; set; }
}
正如您在上面的代码中看到的,Leader为null

如果考虑条件为

var result = (!(cluster.Leader?.IsRemote));
var libresult = (!(cluster.Leader?.IsRemote ?? true));
然后

空条件/Elvis运算符(?)

为集群.Leader?返回null。IsRemoteso!(null)将为null

但如果考虑条件为

var result = (!(cluster.Leader?.IsRemote));
var libresult = (!(cluster.Leader?.IsRemote ?? true));
然后正如我们在上面看到的Null条件/Elvis运算符(?)为
cluster.Leader?返回Null。IsRemote
所以,现在的条件是
!(空??真)

空排序符(??)运算符

(null??true)
将返回true。还有!(真)将

所以,“??true”的好处是,如果左侧的值为空 然后,它应该被认为是布尔(true)。
因为使用前一种方法的结果是
bool
,而使用后一种方法的结果是
bool?
。这取决于上下文,更合适的是什么(显然,如果
Leader
null
,您将有不同的值)。另外,后一个不能直接用于需要
bool
的语句,比如
if
。为什么要从这个答案中删除accept?少了什么?
var libresult = (!(cluster.Leader?.IsRemote ?? true));