Не могу перегрузить оператор '+' для класса объекта - PullRequest
2 голосов
/ 22 июня 2011

У меня есть две или более переменных класса object в c #, которые имеют целочисленные значения.Я хочу перегрузить оператор «+», чтобы мне не пришлось преобразовывать эти переменные, когда бы я ни захотел добавить или вычесть их.Вот мой код ниже:

public static object operator +( object obj1, object obj2)
{
    object o = Convert.toint32(obj1) + Convert.toint32(obj2);
   return o;
}

Нет, проблема в том, что я получаю сообщение об ошибке "One of the parameters of a binary operator must be the containing type"

Почему это происходит?любая помощь приветствуется!

Ответы [ 6 ]

7 голосов
/ 22 июня 2011

Ошибка компилятора говорит вам точно что не так - если вы собираетесь создать пользовательский бинарный оператор, по крайней мере один из типов параметров (для операндов) должен совпадать с типом вы объявляете оператор в (или обнуляемую версию для типов значений).

Это предписано в разделе 10.10.2 C # 4 спецификации :

Следующие правила применяются к объявлениям бинарных операторов, где T обозначает тип экземпляра класса или структуры, содержащей объявление оператора:

  • Бинарный оператор без сдвига должен принимать два параметра, по крайней мере, один из которых должен иметь тип T или T? И может возвращать любой тип.
  • Бинарный оператор << или >> должен принимать два параметра, первый из которых должен иметь тип T или T? а второй из которых должен иметь тип int или int? и может возвращать любой тип.

Лично я бы старался избегать переменных типа object, если вы знаете, что они на самом деле int значения. Почему бы не иметь int переменных вместо

Если вы используете C # 4, другой альтернативой будет сделать их dynamic переменными, где перегрузка оператора будет применяться во время выполнения, а не во время компиляции.

3 голосов
/ 22 июня 2011

Это кажется глупым / нелепым , объекты int s, и, поскольку вы не хотите приводить, вы сделаете свой код менее читаемым, добавив object s (что кажется псих)? Что происходит, когда вы хотите сделать myObj + 1? Вам нужно будет создать огромный массив операторов и перегрузок, и это не стоит усилий.

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

3 голосов
/ 22 июня 2011

Вы не можете переопределить оператор для существующих классов: только ваши собственные классы.

2 голосов
/ 22 июня 2011

Ошибка компилятора точно указывает на проблему.

Вы не можете «внедрить» перегрузку оператора в чужие типы - перегрузка оператора должна применяться к типу, в котором вы ее объявляете.

Термин «применить» в этом случае объясняется ошибкой компилятора: один из параметров должен быть этого типа;другой параметр может быть любого типа.

Так, например:

public class MyType
{
  public static object operator +(MyType obj1, object obj2){
    //define code for adding the object to 'MyType' and return object,
    //or whatever type you want.
  }
}

В этом примере мы создаем оператор между MyType и object, и он работает, потому что этоопределено внутри MyType.Все перегрузки двоичных операторов должны следовать одному и тому же правилу.

2 голосов
/ 22 июня 2011

Вы говорите, что хотите добавить два объекта типа object, вы не можете этого сделать.

Как говорится в сообщении об ошибке, одним из двух параметров метода оператора должен быть тип, в котором вы определили оператор.

т. если вы объявили оператор внутри класса с именем XYZ, то obj1 или obj2 должны быть этого типа.

Нельзя объявлять перегрузки операторов для несвязанных типов.

По сути, вы не можете делать то, что хотите.

1 голос
/ 22 июня 2011

Вы определяете оператор в классе, скажем, class Foo. Компилятор сообщает, что по крайней мере один из двух операндов должен иметь статический тип Foo, например:

public static object operator +( Foo obj1, object obj2)
{
    object o = Convert.toint32(obj1) + Convert.toint32(obj2);
    return o;
}

Не очень ясно, чего вы пытаетесь достичь здесь. Если у вас есть объекты class Foo, но их статический тип - object, то вы ничего не сможете сделать, если сначала не приведете их к Foo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...