vb.net - VB.net中If()函数之谜

标签 vb.net if-statement

我有这个代码:

dstCell.CELL_VALUE_INT = If(srcCell.CELL_VALUE_FLOAT IsNot Nothing,
                            Math.Round(CDbl(srcCell.CELL_VALUE_FLOAT)),
                            Nothing)

srcCell.CELL_VALUE_FLOAT 什么都不是 它神秘地评估为 True 部分!

有趣的是,正常的 If 语句正确评估为 False 部分:
If (srcCell.CELL_VALUE_FLOAT IsNot Nothing) Then
    dstCell.CELL_VALUE_INT = Math.Round(CDbl(srcCell.CELL_VALUE_FLOAT))
Else
    dstCell.CELL_VALUE_INT = Nothing
End If

有任何想法吗?

感谢你!

编辑:
CELL_VALUE_FLOAT 是 Nullable(Of Double) 和 CELL_VALUE_INT 是 Nullable(Of Integer)

在 Quickwatch 中,条件将 correclty 评估为 False,但在运行 If() 函数时评估为 True 部分。

最佳答案

when srcCell.CELL_VALUE_FLOAT is Nothing it mysteriously evaluates to the True part!



不,它没有。它只是将错误部分( Nothing )评估为 0 ,从而设置 CELL_VALUE_INT到 0。

让我详细说明:表达式
Dim i As Integer? = If(False, 1, Nothing)

填充 i0 . (测试一下,如果你不相信我。)

为什么会发生这种情况? Nothing在 VB.NET 中与 null 不一样在 C# 中。如果与值类型一起使用,Nothing表示“该类型的默认值”。 If推断 Integer (不是 Integer? )作为 1 的常见类型和 Nothing ,因此,计算 Nothingdefault(Integer) = 0 .

您可以按如下方式修复此问题:
Dim i As Integer? = If(False, 1, DirectCast(Nothing, Integer?))

在你的例子中,这意味着
dstCell.CELL_VALUE_INT = If(srcCell.CELL_VALUE_FLOAT IsNot Nothing,   
                            Math.Round(CDbl(srcCell.CELL_VALUE_FLOAT)),   
                            DirectCast(Nothing, Integer?))  

现在应该会产生正确的值。

由于这是非常令人惊讶的行为,我提交了 Microsoft Connect suggestion前段时间添加了编译器警告。

关于vb.net - VB.net中If()函数之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10699740/

相关文章:

c# - VB.NET 函数没有返回值,转换为 C# 会返回错误?

vb.net - VB .NET 安装项目 - 许可协议(protocol) - 强制用户在同意之前滚动?

.net - 绑定(bind)到 DataContext 属性的附加属性

javascript - 如何将错误消息放入 if 语句 if(...)

asp.net - 在渲染为位图之前缩放 WPF 内容

.net - Visual Studio 2008 调试器不报告一些常见错误

java - else if 语句

python - if 语句返回 false,而它为 true

c++ - 没有花括号的 "if" block 使后续的 "else if"嵌套

c++ - 加法时总和不正确