为什么我可以将空条件运算符应用于硬编码字符串?

dii*_*___ 1 c# string visual-studio-2015 null-conditional-operator

我有一个bool像这样的变量:

bool myBool = true;
Run Code Online (Sandbox Code Playgroud)

如果我写,if (myBool == null)我得到以下警告:

表达式的结果总是"假",因为类型'bool'的值永远不等于'bool?'类型的'null'.

这对我来说很清楚,因为检查一个不可为空的变量是否为空是没有意义的.Visual Studio注意到并标记为警告.

现在我有一个string,默认情况下可以为空,据我所知.

为什么我可以在string没有Visual Studio注意到硬编码的情况下将空条件运算符应用于硬编码?我在考虑这样的事情:

"This is a string"?.AnyStringMethod();
Run Code Online (Sandbox Code Playgroud)

Visual Studio不应该注意到它string根本不是null吗?

Eri*_*ert 9

警告适用于看起来正确但实际上是错误的代码.

您的代码看起来不对,但无论如何都做对了.

因此:没有警告.


kri*_*gar 8

Visual Studio必须脱离运营商正在使用的类型.

创建a时bool,在将类型更改为之前,类型无法为null bool?.

但是,使用硬编码字符串,即使它在引号内有文本,也不能保证它会保留在那里.创建的"变量"(即使只是一个普通的字符串)仍然是类型string,它可以null分配给它而不改变类型.

您正在寻找的是他们检查他们正在创建的每个变量的值.如果他们这样做,为什么不检查这样的事情呢?

var i = 0;

if (i > 2) // This will always be false!
Run Code Online (Sandbox Code Playgroud)

更新

正如评论中提到的InBetween,这里也存在一些疏忽.如果"Some string"没有在变量中赋值的字符串在功能上等同于const string s = "Some string";.如果您要这样声明,代码检查员将检测您是否对其进行了比较,如下所示:

const string s = "Some String";
if (s == null) // This will give a warning that this can't happen
Run Code Online (Sandbox Code Playgroud)

我认为const处理方式与处理普通静态字符串的方式之间的差异可归因于在不同时间处理不同部分的不同开发团队.同样,这是一个边缘情况,不会引起巨大的问题,它不会被警告,没有人在其上工作很可能没有考虑它.