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

7.17.3Присваивание событий

Если левый операнд оператора += или -= классифицируется как доступ к свойству, то выражение вычисляется следующим образом.

  • Вычисляет выражение экземпляра для доступа к событию (если имеется).

  • Вычисляется правый операнд оператор += или -= и при необходимости преобразуется в тип левого операнда с помощью неявного преобразования (§6.1).

  • Вызывается доступ к событию со списком аргументов, состоящим из правого операнда после вычисления и при необходимости после преобразования. Если оператор равен +=, вызывается метод доступа add; если оператор равен -=, вызывается метод доступа remove.

Выражение присваивания события не порождает значения. Таким образом, выражение присваивания события допустимо только в контексте операторного_выражения (§8.6).

7.18Выражение

Выражение является либо выражением_не_присваивания, либо присваиванием.

выражение: выражение_не_присваивания присваивание

выражение_не_присваивания: условное_выражение выражение_лямбда выражение_запроса

7.19Константные выражения

Константное_выражение — это выражение, которое можно полностью вычислить во время компиляции.

константное_выражение: выражение

Константное выражение должно быть литералом null или значением одного из следующих типов: sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string или являться любым из перечисляемых типов. В константных выражениях допустимы только следующие конструкции:

  • Литералы (включая литерал null).

  • Ссылки на константные члены типов класса и структуры.

  • Ссылки на члены типов перечисления.

  • Ссылки на константные параметры или локальные переменные

  • Вложенные выражения в скобках, которые сами являются константными выражениями.

  • Выражения приведения типа при условии, что целевой тип входит в список типов, указанных выше.

  • Выражения checked и unchecked

  • Выражения значения по умолчанию

  • Стандартные унарные операторы +, –, ! и ~.

  • Стандартные бинарные операторы +, –, *, /, %, <<, >>, &, |, ^, &&, ||, ==,!= , <, >, <= и >= при условии, что каждый операнд имеет тип, указанный в списке выше.

  • Условный оператор?:.

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

  • Преобразования идентификатора

  • Числовые преобразования

  • Преобразования перечисления

  • Преобразования константных выражений

  • Явные и неявные преобразования значений ссылочного типа при условии, что источник преобразования является константным выражением, которое дает значение null.

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

class C { const object i = 5; // error: boxing conversion not permitted const object str = “hello”; // error: implicit reference conversion }

здесь инициализация i приводит к ошибке, потому что требуется преобразование упаковки. Инициализация str вызывает ошибку, потому что требуется неявное преобразование ссылочного типа из ненулевого значения.

Если выражение соответствует требованиям, указанным выше, оно вычисляется во время компиляции. Это так, даже если выражение является вложенным в большее выражение, которое содержит неконстантные конструкции.

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

Если только константное выражение не будет явно помещено в контекст unchecked, переполнения, возникающие при арифметических операциях с целыми типами и преобразованиях при вычислении выражения во время компиляции, всегда будут вызывать ошибки времени компиляции (§7.19).

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

  • Объявления констант (§10.4).

  • Объявления членов перечислений (§14.3).

  • Метки case в операторе switch (§8.7.2).

  • Операторы goto case (§8.9.3).

  • Длины измерений в выражениях создания массивов (§7.6.10.4), которые включают инициализатор.

  • Атрибуты (§17).

Неявное преобразование константного выражения (§6.1.8) допускает преобразование константного выражения с типом int в тип sbyte, byte, short, ushort, uint или ulong при условии, что значение константного выражения находится в пределах диапазона целевого типа.

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