Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
16
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Перегружаемые операторы

В C# пользовательские типы могут перегружать операторы путем определения функций статических членов с помощью ключевого слова operator. Не все операторы могут быть перегружены, а для некоторых операторов есть ограничения. См. следующую таблицу:

Операторы

Возможность перегрузки

+, -, !, ~, ++, --, true, false

Эти унарные операторы можно перегрузить.

+, -, *, /, %, &, |, ^, <<, >>

Эти бинарные операторы можно перегрузить.

==, !=, <, >, <=, >=

Операторы сравнения можно перегрузить (но см. примечание после таблицы).

&&, ||

Условные логические операторы нельзя перегрузить, но они вычисляются с помощью & и |, допускающих перегрузку.

[]

Оператор индексирования массива нельзя перегрузить, но можно определить индексаторы.

()

Оператор приведения нельзя перегрузить, но можно определить новые операторы преобразования (см. explicit и implicit).

+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=

Операторы присвоения нельзя перегрузить, но, например, += вычисляется с помощью +, допускающего перегрузку.

=, ., ?:, ->, new, is, sizeof, typeof

Эти операторы нельзя перегрузить.

Примечание.

Операторы сравнения можно перегружать, но только парами: если перегружен оператор ==, то != также должен быть перегружен. Обратный принцип также действителен и действует для операторов < и >, а также для <= и >=.

Для перегрузки оператора в пользовательском классе нужно создать метод с требуемым заголовком. Метод нужно назвать "operator X", где X — имя или символ перегружаемого оператора. Унарные операторы имеют один параметр, а бинарные — два. В каждом случае один параметр должен быть такого же типа, как класс или структура, объявившие оператор, как показано в следующем примере.

public static Complex operator +(Complex c1, Complex c2)

Дополнительные сведения см. в разделе Перегрузка операторов для реализации класса комплексных чисел.

Conversion Operators

C# enables programmers to declare conversions on classes or structs so that classes or structs can be converted to and/or from other classes or structs, or basic types. Conversions are defined like operators and are named for the type to which they convert. Either the type argument to be converted, or the type of the result of the conversion, but not both, must be the containing type.

class SampleClass

{

public static explicit operator SampleClass(int i)

{

SampleClass temp = new SampleClass();

// code to convert from int to SampleClass...

return temp;

}

}

Conversion Operators Overview

Conversion operators have the following properties:

  • Conversions declared as implicit occur automatically when it is required.

  • Conversions declared as explicit require a cast to be called.

  • All conversions must be static.