Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

10.10.1Унарные операторы

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

  • унарный оператор +, -, ! или ~ должен принимать единственный параметр типа T или T? и может возвращать любой тип;

  • унарный оператор ++ или – должен принимать единственный параметр типа T или T? и должен возвращать тот же самый тип или тип, производный от него;

  • унарный оператор true или false должен принимать единственный параметр типа T или T? и должен возвращать тип bool.

Подпись унарного оператора состоит из лексемы оператора (+, -, !, ~, ++, --, true или false) и типа единственного формального параметра. Тип возвращаемого значения не является частью сигнатуры унарного оператора, как и имя формального параметра.

Для унарных операторов true и false требуется попарное объявление. Если в классе объявлен один из этих операторов без объявления другого, возникает ошибка времени компиляции. Операторы true и false описаны далее в §7.12.2 и §7.20.

В следующем примере показана реализация и последующее применение operator ++ для класса целочисленного вектора.

public class IntVector { public IntVector(int length) {...}

public int Length {...} // read-only property

public int this[int index] {...} // read-write indexer

public static IntVector operator ++(IntVector iv) { IntVector temp = new IntVector(iv.Length); for (int i = 0; i < iv.Length; i++) temp[i] = iv[i] + 1; return temp; } }

class Test { static void Main() { IntVector iv1 = new IntVector(4); // vector of 4 x 0 IntVector iv2;

iv2 = iv1++; // iv2 contains 4 x 0, iv1 contains 4 x 1 iv2 = ++iv1; // iv2 contains 4 x 2, iv1 contains 4 x 2 } }

Обратите внимание, как метод оператора возвращает значение, созданное добавлением 1 к операнду, точно так же, как операторы постфиксного увеличения и уменьшения (§7.6.9) и операторы префиксного увеличения и уменьшения (§7.7.5). В отличие от C++, этому методу не требуется непосредственно изменять значение своего операнда. Фактически изменение значения операнда нарушала бы стандартную семантику оператора постфиксного увеличения.

10.10.2Бинарные операторы

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

  • бинарный оператор не-сдвига должен принимать два параметра, по крайней мере один из которых должен иметь тип T или T?, и может возвращать любой тип;

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

Подпись бинарного оператора состоит из лексемы оператора (+, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >= или <=) и типов этих двух формальных параметров. Тип возвращаемого значения и имена формальных параметров не являются частью сигнатуры бинарного оператора.

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

  • operator == и operator !=

  • operator > и operator <

  • operator >= и operator <=

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]