猜猜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 inference
,Nullable
和{{的帮助1}},但我找不到任何东西。
偷看邻居:c#(很好)拒绝编译等效的
If
有错误
CS0173无法确定条件表达式的类型,因为
之间没有隐式转换int? i = true ? null : 3;
和' int'
什么是安全的,避免落入vb.net中看到的捕获物。但是在VB中,即使'<null>'
+ Option Infer Off
也没有任何错误抛出效果,这可以使程序员免于被忽视的错误。 还是有办法在vb.net生成错误吗?
答案 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)
尼斯!