我只是搬起石头砸自己的脚,想知道是否有真正的原因导致这种情况成为可能。
不管怎样,这个问题可以留下来,以方便未来的足射手。
假设我们在 vb.net 中有一个可为空的值:
Dim i as Integer?
我们想根据条件并使用三元运算符为其分配一个值,因为它非常简洁:
i = If(condition(), Nothing, 42)
也就是说,如果一个条件是true
,采用可空性,否则采用值。
此时发生枪击事件。没有明显的原因,VB 编译器决定使用通用基类型Nothing
and Integer
is Integer
,此时它默默地将语句翻译为:
i = If(condition(), 0, 42)
现在,如果您要在 C# 中执行此操作:
i = (condition()) ? null : 42;
你会立即得到一个编译器错误,指出<null>
不能很好地混合int
。这很棒,因为如果我这次采用 C# 方式,我的脚会更健康。为了编译,你必须显式地编写:
i = (condition()) ? null : (int?)42;
现在轮到你can在 VB 中执行相同的操作并获得您期望的正确的 null 值:
i = If(condition(), Nothing, CType(42, Integer?))
但这首先需要你的脚射门。没有编译器错误,也没有警告。那是与Explicit On
and Strict On
.
所以我的问题是,为什么?
我应该将此视为编译器错误吗?
或者有人可以解释为什么编译器会这样?