This question already has answers here:
Ternary operator VB vs C#: why resolves Nothing to zero?

(7 个回答)


1年前关闭。




当我尝试在 vb.net 中使用三元表达式为变量分配空值时,我感到很惊讶。当我通过三元表达式分配时,它没有按预期工作。

Dim i As Integer? = Nothing
Dim j As Integer? = Nothing
i = If(True, j, 1)
j = If(True, Nothing, 1)

执行此代码后: i 只是 j 变为 0(零)。为什么?
解释是什么?
为什么我不能直接分配 Nothing (Null) 值?

最佳答案

我认为这里要理解的重要一点是 VB.Net 中的 Nothing 与其他语言 中的 null 不同,因为您仍然可以将 Nothing 分配给值类型。在许多其他语言中,null 只是一个引用类型构造。如果您熟悉 C#,那么 Nothing 更接近 default(T) 而不是 null

考虑到这一点,重新审视这个表达式:

If(True, Nothing, 1)

编译器根据自己的优点评估整个表达式,对 ij 一无所知,即使 j 是赋​​值的目标。表达式必须能够独立存在。

VB.Net 还必须确定用于表达式的类型,并且它必须在编译时执行此操作。它无法从 Nothing 的使用中推断出需要 Integer? 而不是基本的不可为 null 的 Integer 用于此类型,因为 VB.Net 非常乐意将 Nothing 分配给值类型。因此,条件表达式的类型只能从最后一个参数中的 1 字面量中推断出来,这是一个普通的 Integer ,而不是 Integer?

鉴于结果类型,我们现在必须将 Nothing 评估为整数,其中结果是您观察到的 0。理论上,这部分是在运行时而不是编译时完成的,但实际上我怀疑编译器或抖动会识别优化事物的机会并将其全部重写为 j = 0

如果您希望能够使用 Integer? 的值分配 Nothing ,请按照您在第一个示例中的操作进行操作,并保留一个可用于分配的正确类型的变量。

关于vb.net - 为什么在条件 "if"赋值中不给变量赋值/空值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57627590/

10-12 16:29