什么是 Nothing?它和 null 有什么不同?

14

最近在之前的一个项目中,我发现了VB.NET和C#之间的一个奇怪的差异。

考虑下面的C#表达式:

null <= 2

这个表达式的值为False,符合我的预期。 然后是相应的VB.NET表达式:

Nothing <= 2

我很惊讶地发现这个表达式实际上评估为True

这似乎是两种语言之间相当基本的设计决策,它肯定让我感到困惑。

有人能告诉我为什么吗? null和Nothing是一样的吗? 如果是,为什么它们的行为不同?


4
在C#中,null <= 2会产生编译时警告,并且不会向输出程序集发出与此操作对应的IL代码。 - Darin Dimitrov
在LINQPAD中尝试一个表达式 - 想象一下null实际上是一个int?其值恰好为null。 - Gavin Osborn
相关问题(虽然不完全相同):https://dev59.com/UHE85IYBdhLWcg3wbTD2 - Hans Olsson
有时候,我在想我们是否应该像C++那样,只是声明一个整数并让它保持在内存中原有的值,而不是尝试给它一个默认值或与null进行比较。 - Vivian River
1个回答

30

在VB中,没有任何东西等同于给定类型的默认值。(详见此链接)。

对于整数比较(编译器将从右操作数推断出来),Nothing将被认为是00<=2之所以成立是很明显的原因 :-)


2
值得一提的是,当与“Is”和“IsNot”运算符结合使用进行空检查时,“Nothing”也可以用作空值。 - Justin Niessner
2
为了完整性:编译器对C#代码做了什么?(object)null不允许与整数进行比较,Int32不能为null...? - Stefan Steinegger
你在我找答案的时候就把我打败了,而且你也得到了同样的链接 :P - Wayne Werner
@Stefan Steinegger:int可以隐式转换为int?。请参见http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx:“从普通类型到可空类型的转换是隐式的。”因此,代码`null <= 3`将导致以下警告:比较类型为'int?'的null始终会产生'false'。我认为这样的代码在C# 2.0中会产生编译时错误。 - Dirk Vollmar
@Dan Puzey:请看这里Eric的回答:https://dev59.com/7nI-5IYBdhLWcg3wMFW0#1972317。他谈到了`==`运算符,但同样适用于`<=运算符。这与CompareTo`重载无关。 - Dirk Vollmar
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接