我只是用脚开枪,想知道是否有实际原因使这种情况成为可能。 无论如何,这个问题可以留给未来的射手们以方便。
假设我们在vb.net中有一个可为空的值:
Dim i as Integer?
我们想根据条件为它分配一个值,并使用三元运算符,因为它是如此的整洁:
i = If(condition(), Nothing, 42)
也就是说,如果条件为true,则采用可为空性,否则采用值。 此时会发生射击。没有明显的原因VB编译器决定,对于共同的基类型Nothing和Integer是Integer,在该点它默默地平移语句:
true
Nothing
Integer
i = If(condition(), 0, 42)
现在,如果要在C#中执行此操作:
i = (condition()) ? null : 42;
您会立即收到一个编译器错误,指出<null>与不能很好地混合使用int。太好了,因为如果我这次使用C#方式,脚会更健康。为了对此进行编译,您必须显式编写:
<null>
int
i = (condition()) ? null : (int?)42;
现在,您 可以 在VB中执行相同的操作,并获得正确的空值:
i = If(condition(), Nothing, CType(42, Integer?))
但这首先需要把脚拍打。没有编译器错误,也没有警告。与Explicit On和在一起Strict On。
Explicit On
Strict On
所以我的问题是,为什么? 我应该将此视为编译器错误吗? 或者有人可以解释为什么编译器会以这种方式运行?
这是因为VB Nothing不直接等同于C#null。
null
例如,在C#中,此代码将无法编译:
int i = null;
但是此VB.Net代码可以正常工作:
Dim i As Integer = Nothing
Nothing实际上,VB.Net 与C#的default(T)表达式更接近。
default(T)