2013-02-26 3 views
1

Я запускал FxCop над своим кодом, и он сообщает о нескольких ошибках CA2224 и CA1815 из-за структур, обладающих функциями Operator =, но без переопределения для .Equals. Будучи послушным человеком, я пытаюсь исправить это, но столкнулся с проблемой. Я создал структуру таким образом: -Невозможно переопределить .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 следующим образом: -

Public Overrides Function Equals(ByVal ss As MyStruct) As Boolean 
    Return Me.my_innards = ss.my_innards 
End Function 

Это дает ошибку компиляции function 'Equals' cannot be declared 'Overrides' because it does not override a function in a base structure

Но когда я пытаюсь: -

Public Function Equals (ByVal ss As MyStruct) As Boolean 
    Return Me.my_innards = ss.my_innards 
End Function 

это вызывает предупреждение function 'Equals' shadows an overridable method in the base class 'ValueType'. To override the base method, this method must be declared 'Overrides'.

Другими словами, я должен и не могу объявить метод как overrides. Может ли кто-нибудь помочь мне с этим?

+0

Попытайтесь использовать «Открытый принцип переопределения функций (ByVal ss as Object) As Boolean' - аргументом этой функции стал« Object » – MarcinJuraszek

+0

Не' ss' типа 'Object' (' object' в C#), ? –

+0

@MarcinJuraszek, правыйo. Это исправлено, спасибо. Кажется довольно странным, однако, что вы можете лопать любую старую вещь в эту функцию. –

ответ

3

Вы должны указать параметр функции, как Object:

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 

Однако, я не уверен, что изменить что-либо с помощью стандартного поведения Structure сравнения - каждое значение в пределах структуры сравнивается по умолчанию.

+0

Как я уже упоминал, FxCop обманывает его, и, используя DirectCast, я могу заставить эту вещь взорваться, если что-то, кроме «MyStruct», будет передано. Надеюсь. –

+1

В соответствии с документацией CA1815: «Для типов значений унаследованная реализация Equals ** использует библиотеку Reflection ** и сравнивает содержимое всех полей. ** Отражение вычислительно дорого ** и сравнение каждого поля для равенства может быть ненужным.Если вы ожидаете, что пользователи будут сравнивать или сортировать экземпляры или использовать их в качестве ключей хеш-таблицы, ваш тип значения должен применять Equals. Если ваш язык программирования поддерживает перегрузку оператора, вы также должны обеспечить реализацию операторов равенства и неравенства. " – bkqc