gpt4 book ai didi

vb.net - 为什么在条件 "if"赋值中不为变量分配任何值/空值?

转载 作者:行者123 更新时间:2023-12-02 06:02:27 27 4
gpt4 key购买 nike

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

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? 而不是基本的不可空 Integer,因为 VB.Net 非常乐意将 Nothing 分配给值类型。因此,条件表达式的类型只能从最终参数中的 1 文字推断出来,它是一个普通的 Integer,而不是 Integer? >.

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

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com