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

7.10.11Оператор as

Оператор as используется для явного преобразования значения в указанный ссылочный тип или обнуляемый тип. В отличие от выражения приведения типа (§7.7.6) оператор as никогда не вызывает исключения. Вместо этого, если указанное преобразование невозможно, возвращается значение null.

В операции вида «E as T» E должно быть выражением, а T должен быть ссылочным типом, параметром типа, который является ссылочным типом, или обнуляемым типом. Кроме того, должно выполняться, по крайней мере, одно из следующих условий. В противном случае будет возникать ошибка времени компиляции.

  • Из E в T существует преобразование идентификации (§6.1.1), неявное преобразование обнуляемых типов (§6.1.4), неявное преобразование ссылочных типов (§6.1.6), преобразование упаковки (§6.1.7), явное преобразование обнуляемых типов (§6.2.3), явное преобразование ссылочных типов (§6.2.4) и преобразование отмены упаковки (§6.2.5).

  • E или T имеет открытый тип.

  • E является литералом null.

Если тип E во время компиляции не является динамическим, операция «E as T» дает такой же результат, как и

E is T ? (T)(E) : (T)null

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

Если тип E во время компиляции динамический, в отличие от оператора приведения оператор as не имеет динамической привязки (§7.2.2). Таким образом, развертывание в данном случае будет следующим:

E is T ? (T)(object)(E) : (T)null

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

В примере

class X {

public string F(object o) { return o as string; // OK, string is a reference type }

public T G<T>(object o) where T: Attribute { return o as T; // Ok, T has a class constraint }

public U H<U>(object o) { return o as U; // Error, U is unconstrained } }

параметр T для G имеет ссылочный тип, поскольку у него есть ограничение класса. Напротив, параметр типа U для H не имеет ссылочного типа, поэтому использование оператора as в H запрещено.

7.11Логические операторы

Операторы &, ^ и | называются логическими операторами.

выражение_И: выражение_равенства выражение_И & выражение_равенства

выражение_исключающего_ИЛИ: выражение_И выражение_исключающего_ИЛИ ^ выражение_И

выражение_включающего_ИЛИ: выражение_исключающего_ИЛИ выражение_включающего_ИЛИ | выражение_исключающего_ИЛИ

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

Для операции вида x op y, где op является одним из логических операторов, чтобы выбрать конкретную реализацию оператора, применяется разрешение перегрузки (§7.3.4). Операнды преобразуются в типы параметров выбранного оператора, а тип результата является типом возвращаемого значения этого оператора.

Стандартные логические операторы описываются в следующих разделах.

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