1

我有一个bool这样的变量:

bool myBool = true;

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

表达式的结果始终为“false”,因为“bool”类型的值永远不会等于“bool?”类型的“null”。

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

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

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

"This is a string"?.AnyStringMethod();

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

4

5 回答 5

9

警告是针对看起来正确但实际上是错误的代码。

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

因此:没有警告。

于 2016-06-28T12:58:07.070 回答
8

Visual Studio 必须脱离操作员正在使用的类型。

当您创建一个bool时,它不可能按类型为 null,直到您将该类型更改为bool?.

但是,对于硬编码字符串,即使它在引号中包含文本,也不能保证它会保留在那里。创建的“变量”(即使只是一个普通字符串)仍然是 type string,它能够null分配给它而不改变类型。

您正在寻找的是让他们检查他们正在创建的每个变量的值。如果他们要这样做,那么为什么不检查类似的东西呢?

var i = 0;

if (i > 2) // This will always be false!

更新

正如评论中提到的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

我会将const处理方式与处理普通静态字符串的方式的差异归因于不同的开发团队在不同的时间处理不同的部分。再一次,这是一个边缘案例,不会引起巨大的问题,它没有得到警告,没有人在研究它很可能没有考虑到它。

于 2016-06-28T12:39:40.713 回答
1

因为没人考虑?您的代码是如此毫无意义,以至于可能没有人预见到它会在生产代码中使用。我很确定这种情况甚至在 C# 设计委员会中都没有出现过,尽管我会持保留态度,直到像 Eric Lippert 这样的人对这个问题有更多的了解。

C# sharp 并非天生具有所有潜在功能,然后有人决定对其进行修剪。为了让编译器发出某个警告,必须有人考虑、实施、测试并记录它。

在 的情况下myBool == null,警告是合理的,因为它是一个看似合理的错误,可能会使其成为生产代码,并且它显然是程序逻辑中的一个错误。第二种情况即使最终投入生产也是完全无害的,所以警告真的没有多大意义。

于 2016-06-28T12:40:12.990 回答
0

因为 bool 是值类型,而 string 是引用类型

值类型不能为空,但引用类型通过 Default 自动为空

Visual Studio 没有注意到的原因,是因为它实际上并不重要。这就像问蓝色是否比绿色更像一种颜色

于 2016-06-28T12:40:40.680 回答
0

字符串文字与字符串对象略有不同。我相信字符串文字基本上就像一个常量,它是不可变的,并且永远不会为空。

当您将字符串文字分配给变量时,您正在创建对内存位置中字符串的引用。该引用可以为空。如果您尝试将字符串变量与另一个字符串连接并存储回原始字符串变量,则内存中的原始字符串将被破坏并创建一个新字符串,即连接字符串。这是因为字符串总是不可变的。

于 2016-06-28T12:47:27.467 回答