【问题标题】:VB .net bc30452 operator = is not defined for types - how to create custom operatorVB .net bc30452 运算符 = 未为类型定义 - 如何创建自定义运算符
【发布时间】:2020-07-06 23:30:38
【问题描述】:

在 VB .NET 中,我收到错误“bc30452 operator = is not defined for types”。我试图创建一个覆盖,但它不起作用。

Public Class question
    Public [question] As String
    Public answer As String

    Public Overrides Function Equals(obj As Object) As Boolean
        If obj Is GetType(question) Then
            If (question = CType(obj, question).question) And (answer = CType(obj, question).answer) Then
                Return True
            Else
                Return False
            End If

        End If
        Return False

    End Function
End Class

【问题讨论】:

  • question 放在括号里是没有意义的。您这样做是为了允许您使用关键字作为标识符。这不是一个开始的关键字。
  • 不要声明公共字段。改为使用属性。此外,私有字段以外的类型和成员的名称以大写字母开头。

标签: vb.net


【解决方案1】:

除了Equals() 方法之外,您还需要重写运算符。 VB.Net 的一个怪癖还要求您重载 <> 运算符,而 .Net 的一个怪癖意味着您还应该在重写 Equals() 时重写 GetHashCode() 方法。

Public Class Question
    Public Property question As String
    Public Property answer As String

    Public Overrides Function Equals(obj As Object) As Boolean
        Dim o As Question = TryCast(obj, Question)
        Return o IsNot Nothing AndAlso o.question.Equals(Me.question) AndAlso o.Answer.Equals(Me.Answer)
    End Function

    Public Shared Operator =(obj1 as Question, obj2 as Question) As Boolean
         Return obj1 IsNot Nothing AndAlso obj1.Equals(obj2)
    End Operator

    Public Shared Operator <>(obj1 As Question, obj2 As Question) As Boolean
        Return obj1 Is Nothing OrElse Not obj1.Equals(obj2) 
    End Operator

    Public Overrides Function GetHashCode() As Integer
        Return HashCode.Combine(Me.question, Me.answer)
    End Function
End Class

至此,我们现在已经完成了大部分工作以实现IEquatable&lt;Question&gt;IComparable&lt;Question&gt;。重命名question 属性或Question 类型也是一个非常好的主意,以避免代码混淆和潜在的错误。

最后,HashCode.Combine() 需要 .Net 平台扩展(请参阅 NuGet)。组合不同字段的哈希码存在一些陷阱,使用这种方法可以更轻松地避免它们并正确执行。

【讨论】:

  • 谢谢,成功了。我从 jmcilhinney 使用它来暂时避免使用扩展。 Public Overrides Function GetHashCode() As Integer Return Question.GetHashCode() Xor Answer.GetHashCode() End Function
【解决方案2】:

问题是您的类型和字段使用相同的名称,而当您指的是另一个时,标识符被解释为一个。使用我来限定该字段,您应该没问题。最好还是使用不同的名称。

我刚刚测试了您的代码,但没有看到该错误消息,所以我不确定您的结果是什么。也就是说,这是一个更好的实现:

Public Class Question

    Public Property Question As String

    Public Property Answer As String

    Public Overrides Function Equals(obj As Object) As Boolean
        Dim otherQuestion = TryCast(obj, Question)

        Return Question = otherQuestion?.Question AndAlso Answer = otherQuestion?.Answer
    End Function

    Public Overrides Function GetHashCode() As Integer
        Return Question.GetHashCode() Xor Answer.GetHashCode()
    End Function

    Public Shared Operator =(q1 As Question, q2 As Question) As Boolean
        Return q1?.Question = q2?.Question AndAlso q1?.Answer = q2?.Answer
    End Operator

    Public Shared Operator <>(q1 As Question, q2 As Question) As Boolean
        Return q1?.Question <> q2?.Question AndAlso q1?.Answer <> q2?.Answer
    End Operator

End Class

使用适当的命名和属性而不是字段。 TryCast 方法将返回指定类型的引用,如果它是该类型,则该引用指向原始对象;如果不是,则返回 Nothing?. 运算符说明了引用可能是 Nothing 并且如果是,则评估为 Nothing

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 2020-10-10
    • 1970-01-01
    • 2021-11-30
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多