2016-04-04 3 views
3

Я пытаюсь перегрузить оператор ==, но я имею следующую ошибку:C# Перегрузка операторов ==

Overloadable unary operator expected

Вот мой код

public bool operator == (MyClass nm1) 
    { 
     return true; 
    } 

    public bool operator != (MyClass m2) 
    { 
     return true; 
    } 

Я последовал msdn note, но все еще получаю та же ошибка

+0

Методы работы оператора являются статическими. Это означает, что '==' и '! =' Имеют 2 операнда. Нажмите ссылку «Перегрузка оператора» на этой же странице. –

+0

'public static bool operator == (MyClass m1, MyClass m2)' – willaien

ответ

4

При перегрузке operator == вы должны сделать это в static метод, который принимает два экземпляра в качестве параметров:

public static bool operator == (MyClass leftSide, MyClass rightSide) { 
    return true; 
} 

public static bool operator != (MyClass leftSide, MyClass rightSide) { 
    return !(leftSide == rightSide); 
} 

static контекст делает код для вашего оператора чувствовать себя более «симметричный», в том смысле, что код выполнение сравнения не относится к левому экземпляру или к правильному экземпляру.

Кроме того, static не позволяет «виртуализировать» оператора (вы все равно можете сделать это внутри реализации, вызвав виртуальную функцию, но тогда вам нужно сделать это явно).

+0

ohh Я вижу .. будет ли первый параметр левым операндом? – Kasparov92

+1

@ Kasparov92 Да, первый операнд - левая сторона, а второй операнд - правая. – dasblinkenlight

+0

@ Kasparov92 Да, но порядок не должен иметь значения, поскольку равенство должно быть симметричным. – juharr

3

Вам нужно static, и вам нужны два параметра, а не один.

== и != всегда бинарные операторы (два аргумента), а не унарный (один аргумент).

2

Как вы можете видеть в MSDN tutorial, это двоичные операторы и, следовательно, им нужны два аргумента. Операторы также должны быть статические, поскольку они будут частью класса, а не экземпляром. См. this & this.

public static bool operator == (MyClass nm1, MyClass mn2) 
{ 
    return true; 
} 

public static bool operator != (MyClass m1, MyClass m2) 
{ 
    return true; 
} 
0
public static bool operator == (MyClass m1, MyClass m2) 
    { 
     return true; 
    } 

    public static bool operator != (MyClass m1, MyClass m2) 
    { 
     return true; 
    } 
2

правильная подпись:

public static bool operator ==(MyClass nm1, MyClass other) 
{ 

} 

public static bool operator !=(MyClass nm1, MyClass other) 
{ 

} 

Второй параметр не обязательно должен быть типа MyClass хотя - но, по крайней мере, один из них должен быть.

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