我有这个代码:
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)
填充
i
与 0
. (测试一下,如果你不相信我。)为什么会发生这种情况?
Nothing
在 VB.NET 中与 null
不一样在 C# 中。如果与值类型一起使用,Nothing
表示“该类型的默认值”。 If
推断 Integer
(不是 Integer?
)作为 1
的常见类型和 Nothing
,因此,计算 Nothing
如 default(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/