一尘不染

三元运算符VB与C#:为什么什么都不能归零?

c#

我只是用脚开枪,想知道是否有实际原因使这种情况成为可能。
无论如何,这个问题可以留给未来的射手们以方便。


假设我们在vb.net中有一个可为空的值:

Dim i as Integer?

我们想根据条件为它分配一个值,并使用三元运算符,因为它是如此的整洁:

i = If(condition(), Nothing, 42)

也就是说,如果条件为true,则采用可为空性,否则采用值。
此时会发生射击。没有明显的原因VB编译器决定,对于共同的基类型NothingIntegerInteger,在该点它默默地平移语句:

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


所以我的问题是,为什么?
我应该将此视为编译器错误吗?
或者有人可以解释为什么编译器会以这种方式运行?


阅读 207

收藏
2020-05-19

共1个答案

一尘不染

这是因为VB Nothing不直接等同于C#null

例如,在C#中,此代码将无法编译:

int i = null;

但是此VB.Net代码可以正常工作:

Dim i As Integer = Nothing

Nothing实际上,VB.Net 与C#的default(T)表达式更接近。

2020-05-19