最近在之前的一个项目中,我发现了VB.NET和C#之间的一个奇怪的差异。
考虑下面的C#表达式:
null <= 2
这个表达式的值为False,符合我的预期。 然后是相应的VB.NET表达式:
Nothing <= 2
我很惊讶地发现这个表达式实际上评估为True。
这似乎是两种语言之间相当基本的设计决策,它肯定让我感到困惑。
有人能告诉我为什么吗? null和Nothing是一样的吗? 如果是,为什么它们的行为不同?
在VB中,没有任何东西等同于给定类型的默认值。(详见此链接)。
对于整数比较(编译器将从右操作数推断出来),Nothing
将被认为是0
。0<=2
之所以成立是很明显的原因 :-)
(object)null
不允许与整数进行比较,Int32
不能为null...? - Stefan Steineggerint
可以隐式转换为int?
。请参见http://msdn.microsoft.com/en-us/library/2cf62fcy.aspx:“从普通类型到可空类型的转换是隐式的。”因此,代码`null <= 3`将导致以下警告:比较类型为'int?'的null始终会产生'false'。我认为这样的代码在C# 2.0中会产生编译时错误。 - Dirk Vollmar运算符。这与
CompareTo`重载无关。 - Dirk Vollmar
null <= 2
会产生编译时警告,并且不会向输出程序集发出与此操作对应的IL代码。 - Darin Dimitrov