Vb.net Can';t在结构上等于

Vb.net Can';t在结构上等于,vb.net,Vb.net,我一直在我的代码上运行FxCop,它报告了许多CA2224和CA1815错误,原因是结构具有运算符=函数,但没有覆盖.Equals。作为一个尽职尽责的人,我正在努力纠正这些问题,但遇到了一个问题。我创建了这样一个结构:- Public Structure MyStruct Public my_innards As Integer Public Shared Operator =(ByVal fs As MyStruct, ByVal ss As MyStruct) As Bo

我一直在我的代码上运行FxCop,它报告了许多CA2224和CA1815错误,原因是结构具有
运算符=
函数,但没有覆盖
.Equals
。作为一个尽职尽责的人,我正在努力纠正这些问题,但遇到了一个问题。我创建了这样一个结构:-

Public Structure MyStruct

    Public my_innards As Integer

    Public Shared Operator =(ByVal fs As MyStruct, ByVal ss As MyStruct) As Boolean
        Return fs.my_innards = ss.my_innards
    End Operator

    Public Shared Operator <>(ByVal fs As MyStruct, ByVal ss As MyStruct) As Boolean
        Return fs.my_innards <> ss.my_innards
    End Operator

End Structure
这会产生编译错误
函数“Equals”不能声明为“Overrides”,因为它不会重写基结构中的函数

但当我尝试时:-

Public Function Equals (ByVal ss As MyStruct) As Boolean
    Return Me.my_innards = ss.my_innards
End Function
这将生成警告
函数“Equals”隐藏基类“ValueType”中的可重写方法。若要重写基本方法,必须将此方法声明为“重写”


换句话说,我必须(也可能不必)将该方法声明为
覆盖
。有人能帮我解决这个问题吗

必须将函数参数指定为
对象

Public Structure MyStruct

    Public Property Test As Integer

    Public Overrides Function Equals(obj As Object) As Boolean
        If obj Is GetType(MyStruct) Then
            Return Test = CType(obj, MyStruct).Test
        End If
        Return False
    End Function

End Structure

但是,我不确定它是否会改变标准的
结构
比较行为-默认情况下会比较结构中的每个值。

必须将函数参数指定为
对象

Public Structure MyStruct

    Public Property Test As Integer

    Public Overrides Function Equals(obj As Object) As Boolean
        If obj Is GetType(MyStruct) Then
            Return Test = CType(obj, MyStruct).Test
        End If
        Return False
    End Function

End Structure

但是,我不确定它是否会使用标准的
结构更改任何内容
比较行为-默认情况下会比较结构中的每个值。

尝试使用
公共覆盖函数Equals(ByVal ss作为对象)作为布尔值
-该函数的参数必须是
对象
,而不是
对象
类型的
ss
对象
,在C#)中?@MarcinJuraszek,righto。已经修好了,谢谢。不过,你可以把任何旧东西都塞进这个函数似乎有点奇怪。试着将
Public Overrides function Equals(ByVal ss作为Object)作为Boolean
——这个函数的参数应该是
Object
,而不是
ss
类型的
Object
Object
在C#)中?@MarcinJuraszek,right。已经修好了,谢谢。不过,似乎有点奇怪,你可以在这个函数中添加任何旧的东西。正如我提到的,FxCop对此感到困惑,通过使用DirectCast,如果传入的不是
MyStruct
,我就可以让这个东西爆炸。我希望如此。根据CA1815文件:对于值类型,Equals的继承实现使用反射库,并比较所有字段的内容。反射在计算上很昂贵,比较每个字段是否相等可能是不必要的。如果您希望用户比较或排序实例,或者将它们用作哈希表键,那么您的值类型应该实现Equals。如果您的编程语言支持运算符重载,则还应提供相等运算符和不等运算符的实现。“正如我提到的,FxCop对此感到困惑,如果传入的不是
MyStruct
,我可以使用DirectCast使事情爆炸。我希望如此。根据CA1815文件:对于值类型,Equals的继承实现使用反射库,并比较所有字段的内容。反射在计算上很昂贵,比较每个字段是否相等可能是不必要的。如果您希望用户比较或排序实例,或者将它们用作哈希表键,那么您的值类型应该实现Equals。如果您的编程语言支持运算符重载,则还应提供相等运算符和不等运算符的实现。”