2013-12-17 3 views
4

Как определить оператор == для экземпляров моего класса? Я пытался так:Как переопределить оператор ==

public bool operator == (Vector anotherVector) 
{ 
    return this.CompareTo(anotherVector) == 1 ;    
} 

, но он говорит:

Перегружаемые ожидается унарный оператор

+0

Операторы должны быть статическими. – Jeremy

ответ

9

Вам необходимо пометить метод как static, а также вы должны реализовать не равны !=.

public static bool operator ==(Vector currentVector,Vector anotherVector) 
{ 
    return currentVector.CompareTo(anotherVector) == 1 ;    
} 

Для двух объектов необходимо ввести ==.

И для !=

И

public static bool operator !=(Vector currentVector,Vector anotherVector) 
{ 
    return !(currentVector.CompareTo(anotherVector) == 1) ; 
} 

См: Guidelines for Overloading Equals() and Operator == (C# Programming Guide)

перегруженный оператор == реализации не должны бросать исключения. Любой тип, который перегружает оператор ==, также должен перегружать operator! =.

+3

'static' функции не могут использовать' this'. –

+0

Несомненно, 'this' в вопросе должен был указывать левый операнд. –

+0

@BenVoigt, я в порядке с downvote и заслуживаю того, чтобы не хватать «этого». Но я больше беспокоился о 'static' и реализации'! = ' – Habib

3

В отличие от C++, что позволяет операторам быть определены как функции-члены экземпляра, так что левый операнд становится this указатель, C# оператор перегрузки всегда выполняется в виде статических функций-членов.

Не может быть указатель this, и оба операнда являются явными параметрами.

public static bool operator==(Vector left, Vector right) 
{ 
    return left.CompareTo(right) == 1;    
} 

(Хотя это кажется семантически неверно, обычно CompareTo возвращает ноль для эквивалентности)

+0

И как тогда я называю сравнение? – user2128702

+0

@ user2128702: Эта часть похожа на C++. Если у вас есть два вектора 'a' и' b', напишите 'if (a == b)' или 'bool same = (a == b);' –

+2

+1 "Семантически некорректный". Да. Хотя подумайте об этом, он должен переопределить «Equals (Vector)» и реализовать «==» в терминах этого. Это 'return left.Equals (right)'. –

2

Я полностью согласен с ответом Хабиба - тоже +1 это ... только не забудьте обработать аннулирует.

public static bool operator ==(Vector left, Vector right) 
     { 
      if ((object)left == null) 
       return (object)left == null; 

      if ((object)right == null) 
       return false; 

      return ...; 
     } 

слишком большой, чтобы опубликовать его комментарий. Надеюсь это поможет.

Смежные вопросы