首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运算符“=”未定义为“DBNull”和“DBNull”类型

运算符“=”未定义为“DBNull”和“DBNull”类型
EN

Stack Overflow用户
提问于 2019-03-01 16:22:58
回答 3查看 2.1K关注 0票数 1

在使用SqlDataReader (即“reader”)时,我在试图检查某个值是否为DBNull时遇到了以下错误。

运算符'=‘不是为'DBNull’和'DBNull‘类型定义的。

使用以下代码时:

代码语言:javascript
复制
If reader("MyColumn") = DBNull.Value Then
  '...
End If

我通过调用IsDBNull()绕过了错误,我怀疑这是因为' is‘和'=’之间的区别。

然而,我的问题是:为什么不能使用'=‘操作符进行比较?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-01 17:07:37

并非所有类型都可以使用=运算符。当一个类型定义了各种操作符应该如何使用它的逻辑时,它被称为“操作符重载”(诚然,这有点令人困惑,因为它与方法重载无关,而且与方法重载完全不同)。基本Object类型不会重载=运算符,因此,当您创建自定义类时,它不会从Object继承=运算符重载。因此,只有特定重载运算符的类型才能实际使用它。例如,以下代码将不会编译:

代码语言:javascript
复制
Module Module1
    Public Sub Main()
        Dim dan As New Person() With {.Id = 1, .Name = "Daniel Thorne"}
        Dim steve As New Person() With {.Id = 2, .Name = "Steven Doggart"}
        If dan = steve Then
            Console.WriteLine("They're the same")
        End If
    End Sub

    Public Class Person
        Public Property Id As Integer
        Public Property Name As String
    End Class
End Module

编译器提供以下生成错误:

BC30452运算符'=‘未为'Module1.Person’和'Module1.Person‘定义。

然而,这将如预期的那样建立和发挥作用:

代码语言:javascript
复制
Public Sub Main()
    Dim dan As New Person() With {.Id = 1, .Name = "Daniel Thorne"}
    Dim steve As New Person() With {.Id = 2, .Name = "Steven Doggart"}
    If dan = steve Then
        Console.WriteLine("They're the same")
    End If
End Sub

Public Class Person
    Public Property Id As Integer
    Public Property Name As String

    Public Shared Operator =(x As Person, y As Person) As Boolean
        Return AreEqual(x, y)
    End Operator

    Public Shared Operator <>(x As Person, y As Person) As Boolean
        Return Not AreEqual(x, y)
    End Operator

    Private Shared Function AreEqual(x As Person, y As Person) As Boolean
        If (x Is Nothing) And (y Is Nothing) Then
            Return True
        ElseIf (x IsNot Nothing) And (y IsNot Nothing) Then
            Return x.Id = y.Id
        Else
            Return False
        End If
    End Function
End Class

因此,在DBNull上出现错误的原因是,不管出于什么原因,编写该类的开发人员选择不为其重载=运算符。至于为什么,你猜和我的一样好。

另外请注意,您也可以重载许多其他操作符,这有时是有用的。不过,要小心。如果你在使用运算符过载时过于自由,你可能会后悔。

票数 1
EN

Stack Overflow用户

发布于 2019-03-01 16:51:04

在SQL中,null = null计算为false。这可能是为什么没有为这种类型定义相等运算符的原因。

您无法确定未知的东西是否等于其他未知的东西,从而使相等操作符变得无用。

使用DBNull.Value.Equals()确定它是否为空。

票数 2
EN

Stack Overflow用户

发布于 2021-10-14 14:43:51

SqlDataReader类有一个这样的方法:SqlDataReader.IsDBNull(Int32)方法

代码语言:javascript
复制
Dim colNum = reader.GetOrdinal("MyColumn")
If sqlReader.IsDBNull(colNum) Then
    ' Do something
End If
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54948574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档