Visual Basic中的可空类型推断 - 是否在某处记录并且可以更严格?

时间:2016-05-15 09:46:42

标签: .net vb.net nullable type-inference

 

猜猜i

的结果
Dim i As Integer? = If(True, Nothing, 3)

答案:0

如果您希望获得Nothing,则必须修改整数参数:

Dim i As Integer? = If(True, Nothing, New Nullable(3))

如您所见,第2和第3个参数的结果类型推断优先于T之前的Nullable(Of T)。对我来说,逻辑恰恰相反。

哪些类型的推理/优先级排序规则(特别是Nullable)可以在哪里找到?我检查了type inferenceNullable和{{的帮助1}},但我找不到任何东西。

偷看邻居:(很好)拒绝编译等效的

If

有错误

  

CS0173无法确定条件表达式的类型,因为int? i = true ? null : 3; 和' int'

之间没有隐式转换

什么是安全的,避免落入中看到的捕获物。但是在VB中,即使'<null>' + Option Infer Off也没有任何错误抛出效果,这可以使程序员免于被忽视的错误。 还是有办法在生成错误吗?

1 个答案:

答案 0 :(得分:0)

 

好的,现在我明白了。罪魁祸首是对Nothing的解释。

Nothing更改为“true”null会产生正确的结果:

Dim i As Integer? = If(True, New Nullable(Of Integer), 3)

结果:i Is Nothing

所以可能的问题是Nothing似乎首先被编译器视为另一种类型(整数)的默认值而不是null。改变其隐含意义有助于。反正一个棘手的地方。 如果有人能够找到这个记录,那就太好了。(我不坚持这个答案。)如果发生这种情况可以强制VB抛出错误或警告会很好,类似到C#。

如其他地方的comment所示,可以存在一种更好的符号形式:

Dim i As Integer? = If(True, Integer?, 3)

尼斯!