为何CustomClass为Nothing时,Query方法中second.HasValue返回0而非Nothing?
问题分析与解决
我完全懂你的困惑——你本来预期当CustomClass为Nothing时,传入Query方法的是一个无值的Integer?(也就是HasValue=False的状态),但实际却得到了HasValue=True且值为0的结果。问题根源出在VB的类型推断和Nothing的隐式转换逻辑上。
为什么会出现这个问题?
看你Run方法里的核心代码:
If(CustomClass IsNot Nothing, CustomClass.Id, Nothing)
VB的If表达式会自动根据两个分支的类型推断整体返回类型:
- 第一个分支
CustomClass.Id是值类型Integer - 第二个分支的
Nothing在没有明确类型约束的情况下,会被VB隐式转换为和第一个分支匹配的类型——也就是Integer的默认值0
所以当CustomClass为Nothing时,这个表达式返回的不是Integer?的Nothing(无值状态),而是Integer类型的0;传入Query方法时,这个0会被自动装箱为Integer?类型,自然second.HasValue就是True,值为0。
解决方案:明确指定Nullable类型
你需要告诉VB,第二个分支的类型是Integer?,这样整个表达式的返回类型就会被推断为Integer?,而非Integer。这里有几种简单的实现方式:
- 方式1:显式转换
Nothing为Integer?
Return Query(If(CustomClass IsNot Nothing, CustomClass.Id, CType(Nothing, Integer?)))
- 方式2:使用
Integer?的默认构造函数
Return Query(If(CustomClass IsNot Nothing, CustomClass.Id, New Integer?()))
- 方式3:提前声明带类型的变量
Dim queryParam As Integer? = If(CustomClass IsNot Nothing, CustomClass.Id, Nothing) Return Query(queryParam)
这里因为queryParam被明确声明为Integer?,VB会正确把Nothing解析为无值的Nullable状态。
修改后再测试,当CustomClass为Nothing时,传入Query的second参数就会是HasValue=False,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Arie
相关产品推荐
相关产品推荐

