我希望清除一些混乱,我找不到一个有意义的直接答案.我们有一些查询,我们想要特定字段具有NULL值的记录.这些是简单的选择查询,没有聚合或左连接等.Microsoft建议查询看起来像这样MSDN Link:
dim query = from a in MyContext.MyTables Where a.MyField = nothing Select a
我有几个项目,我正是这样做的,它工作得很好,在IDE中没有警告.最近,另一个开发人员创建了一个新项目,当他像上面那样进行空检查时,我们都在IDE中收到此警告:
警告1此表达式将始终计算为nothing(由于equals运算符的空传播).要检查值是否为null,请考虑使用“Is nothing”.
比较项目,每个都有选项显式和选项严格.如果我们忽略警告,我们会在应用程序运行时获得我们正在寻找的确切记录集.如果我将=符号更改为IS,则警告消失.但为什么这个警告出现在一个项目而不是其他项目?即使在MSDN上也有使用equals运算符的例子,这令人困惑.
解决方法
您看到此警告的原因是因为编译器将基本类型的常规相等运算符提升为Nullable(Of T)版本.它基本上执行以下操作
Dim myField As Integer? = a.MyField Dim other As Integer? = nothing If myField = other Then ... End If
问题虽然是整数?没有什么值,它不会与任何东西相比.因此,上面的Where子句将始终返回False.编译器试图警告你有关Nullable(Of T)的这个有问题的角落,并推动你进行Is nothing检查,这将确定a.MyField是否具有非null值.
这篇博客文章非常详细地解释了为什么要生成此警告以及它背后的所有机制.本文是为C#编写的,但基本前提也适用于VB.Net.
> http://blogs.msdn.com/b/abhinaba/archive/2005/12/14/503533.aspx
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。