假设我们在 VB.NET 中有一个可空值:
Dim i as Integer?
我们想根据条件使用三元运算符给它赋值,因为这样很整洁:
i = If(condition(), Nothing, 42)
也就是说,如果条件为true
,则使用nullability,否则使用该值。
在这一点上,问题就出现了。VB编译器不知何故决定Nothing
和Integer
的共同基本类型是Integer
,然后悄悄地将语句翻译成:
i = If(condition(), 0, 42)
现在,如果您想使用C#完成这个操作:i = (condition()) ? null : 42;
你会立即收到编译器错误,提示<null>
不能与int
混合使用。这很棒,因为如果我按照C#的方式做,我的脚可能会更加健康。为了编译通过,你必须显式地写出:
i = (condition()) ? null : (int?)42;
现在,您可以在 VB 中执行相同的操作,并获得您所期望的正确的 null 值:i = If(condition(), Nothing, CType(42, Integer?))
但这需要你先将脚打穿。没有编译器错误和警告。这是使用Explicit On
和Strict On
的情况。
所以我的问题是,为什么?
我应该把这视为编译器的一个错误吗?
还是有人可以解释一下为什么编译器会这样做?
new Integer?
而不是不写任何东西。这样更冗长,但可以消除歧义。 - Jonathan Allen