我只是朝自己的脚开枪,想知道是否有真正的理由使这种情况成为可能。
而且无论如何,为了方便未来的射手,这个问题可以保留。
假设我们在 vb.net 中有一个可为空的值:
Dim i as Integer?
我们想为它分配一个值,基于一个条件,并使用三元运算符,因为它是如此整洁和东西:
i = If(condition(), Nothing, 42)
也就是说,如果条件是true
,则使用可空性,否则使用值。
在这一点上发生了枪击事件。没有明显的原因,VB 编译器决定 and 的通用基本类型Nothing
是Integer
,Integer
此时它默默地将语句转换为:
i = If(condition(), 0, 42)
现在,如果您要在 C# 中执行此操作:
i = (condition()) ? null : 42;
你会立即得到一个编译器错误,说它<null>
不能很好地与int
. 这很好,因为如果我这次采用 C# 方式,我的脚会更健康。要编译它,您必须显式编写:
i = (condition()) ? null : (int?)42;
现在,您可以在 VB 中执行相同的操作并获得您期望的正确空值:
i = If(condition(), Nothing, CType(42, Integer?))
但这首先需要你的脚射门。没有编译器错误,也没有警告。那是Explicit On
和Strict On
。
所以我的问题是,为什么?
我应该把它当作编译器错误吗?
或者有人可以解释为什么编译器会这样吗?