C# 为什么在“中使用elvis运算符”;如果;语句不再是布尔代数了?

C# 为什么在“中使用elvis运算符”;如果;语句不再是布尔代数了?,c#,C#,此代码如下所示: class B { public bool FinishedDownloading { get; set; } = false; }; class A { public B DownloadStream { get; set; } }; A a = new A(); Console.WriteLine(a.DownloadStream?.FinishedDownloading != false); Console.WriteLine(a.DownloadS

此代码如下所示:

class B
{
    public bool FinishedDownloading { get; set; } = false;
};

class A
{
    public B DownloadStream { get; set; }
};

A a = new A();

Console.WriteLine(a.DownloadStream?.FinishedDownloading != false);
Console.WriteLine(a.DownloadStream?.FinishedDownloading == true);
产出:

True
False
下载流到底是怎么回事?.下载完毕!=当
DownloadStream
null
FinishedDownloading
false
时,false为
true

让我们忘掉发生了什么,专注于结果

我们知道这句话
a.DownloadStream?.FinishedDownloading!=false是真的,因为它不是false,所以在我们的宇宙中,当某件事是真的,那么它应该是真的,因为1==1,对吗

那么,为什么我们要
a.DownloadStream?.FinishedDownloading==true
结果现在是false?!疯狂

我想我知道这里发生了什么。这是因为当DownloadStream为
null
时,则
FinishedDownloading
布尔值不可访问,因此左侧为null,因此C#“思考”:

  • a.DownloadStream?.FinishedDownloading!=错误
    好的,让我们检查null值是否不等于布尔值“false”。嗯,当然不是,所以让我们输出true

  • a.DownloadStream?.FinishedDownloading==true
    好的,让我们比较一个空值和布尔“真”值。嗯,那没有任何意义。这不是真的,所以让我们输出false


有人知道这是不是真的吗?我发现它非常混乱且容易出现错误。

您忘记了
Nullable
(也称为
bool?
)和
bool
是两种不同的类型,具有不同的可能值列表

  • bool
    可以是
    true
    false
  • bool?
    可以是
    true
    false
    null
由于您从未初始化过
DownloadStream
属性,因此它是
null
a.DownloadStream?.FinishedDownloading
因此返回值为
null的
bool?
,因为
?。
传播null

null!=false
为true,因为它们是两个完全不同的值

如果初始化
DownloadStream
属性,例如通过执行以下操作:

class A
{
    public B DownloadStream { get; set; } = new B();
};

然后您将看到
a.DownloadStream?.FinishedDownloading!=false
将返回
false
,这正是您所期望的。

因为如果
a.DownLoadStream
为null,您将得到
null!=false
,这是真的。如果a.DownloadStream==null,那么您的表达式可以归结为'If null==true',这是假的“a.DownloadStream?FinishedDownloading!=false到底是怎么回事”—如果您编写类似这样的内容
If(null!=false)
,您将得到-
警告:CS0472表达式的结果总是“true”,因为类型为“bool”的值永远不等于类型为“bool”的“null”
@BartłomiejStyś您需要在代码中包含
if(null!=false)
才能看到该警告,这是为了测试目的,以了解发生了什么
null
表示
DownloadStream
null
时的值。我想您需要类似
的东西!a、 下载流?完成下载??当您的
下载流
null
时,为false。