【问题标题】:Why in the conditionnal "if" assignement do not assign nothing/null value to a variable? [duplicate]为什么在条件“if”赋值中不为变量分配空值/空值? [复制]
【发布时间】:2019-08-23 13:40:54
【问题描述】:

当我尝试在 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


【解决方案1】:

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

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

If(True, Nothing, 1)

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

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

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-04
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2018-01-13
相关资源
最近更新 更多