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。