繁体   English   中英

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

[英]Why can I apply a null-conditional operator to a hardcoded string?

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

bool myBool = true;

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

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

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

现在,我有一个string ,据我所知默认为空。

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

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

Visual Studio是否不应该注意到此string根本不为null?

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

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

因此:无警告。

Visual Studio必须退出操作员正在使用的类型

创建bool ,在将类型更改为bool?之前,无法通过类型将其设置为null bool?

但是,对于硬编码的字符串,即使它在引号中包含文本,也无法保证它会保留在该位置。 创建的“变量”(即使只是纯字符串)仍然是string类型,可以为其分配null而不更改类型。

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

var i = 0;

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

更新资料

正如评论中提到的InBetween一样 ,这里也有一些疏忽之处。 没有在变量中分配的诸如"Some string"类的"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的方式与处理普通静态字符串的方式的不同,这可以归因于在不同时间处理不同部分的不同开发团队。 同样,这是一个极端情况,不会引起大问题,因此不会警告说没有人对此进行过思考。

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

C#Sharp并非天生具有所有潜在功能,因此有人决定对其进行修剪。 为了使编译器发出一定的警告,必须有人考虑,实施,测试并记录它。

如果myBool == null ,则警告是合理的,因为它是一个可能的错误,有可能使它成为生产代码,并且显然是程序逻辑中的错误。 第二种情况即使最终投入生产也完全没有害处,因此该警告确实没有多大意义。

因为布尔是值类型,而字符串是引用类型

值类型不能为空,但引用类型会通过默认值自动为空

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM