Checked и unchecked 10 страница
E is T? (T)(object)(E): (T)null Обратите внимание, что некоторые преобразования, например пользовательские преобразования нельзя использовать с оператором as и вместо них следует использовать выражения приведения типа. В примере class X public string F(object o) { public T G<T>(object o) where T: Attribute { public U H<U>(object o) { параметр T для G имеет ссылочный тип, поскольку у него есть ограничение класса. Напротив, параметр типа U для H не имеет ссылочного типа, поэтому использование оператора as в H запрещено.
7.11 Логические операторы; Операторы &, ^ и | называются логическими операторами. выражение_И: выражение_исключающего_ИЛИ: выражение_включающего_ИЛИ: Если операнд логического оператора имеет динамический тип во время компиляции, то он динамически связан (§7.2.2). В этом случае тип времени компиляции выражения динамический, а разрешение, приведенное ниже, будет иметь место во время выполнения при использовании типа времени выполнения тех операндов, которые имеют динамический тип во время компиляции. Для операции вида x op y, где op является одним из логических операторов, чтобы выбрать конкретную реализацию оператора, применяется разрешение перегрузки (§7.3.4). Операнды преобразуются в типы параметров выбранного оператора, а тип результата является типом возвращаемого значения этого оператора. Стандартные логические операторы описываются в следующих разделах. 7.11.1 Логические операторы для целых чисел К стандартным логическим операторам для целых чисел относятся: int operator &(int x, int y); int operator |(int x, int y); int operator ^(int x, int y); Оператор & выполняет логическую побитовую операцию AND для двух операндов, оператор | выполняет логическую побитовую операцию OR для двух операндов, а оператор ^ выполняет логическую побитовую операцию исключающего OR для двух операндов. Эти операции не порождают переполнения. 7.11.2 Логические операторы для перечислений Каждый тип перечисления E неявно предоставляет следующие стандартные логические операторы: E operator &(E x, E y); Результат вычисления x op y, где x и y являются выражениями с типом перечисления E базового типа U, а op является одним из логических операторов, в точности равен значению (E)((U)x op (U)y). Другими словами, логические операторы для перечислений просто выполняют логические операции над базовым типом двух операндов. 7.11.3 Логические операторы; К стандартным логическим операторам относятся: bool operator &(bool x, bool y); bool operator |(bool x, bool y); bool operator ^(bool x, bool y); Результат x & y равен true, если оба операнда x и y равны true. Иначе результат равен false. Результат x | y равен true, если хотя бы один операнд x или y равен true. Иначе результат равен false. Результат x ^ y равен true, если x равен true, а y равен false, либо если x равен false, а y равен true. Иначе результат равен false. Когда операнды имеют тип bool, оператор ^ дает такой же результат, как и оператор!=. 7.11.4 Обнуляемые логические операторы Обнуляемый логический тип bool? может представлять три значения: true, false и null, и, по сути, аналогичен типу из трех значений, используемому в логических выражениях в SQL. Чтобы обеспечить согласованность результатов операторов & и | с операндами типа bool? с троичной логикой SQL, предоставляются следующие стандартные операторы: bool? operator &(bool? x, bool? y); bool? operator |(bool? x, bool? y); В следующей таблице перечисляются результаты данных операторов для всех комбинаций значений true, false и null.
7.12 Условные логические операторы Операторы && и || называются условными логическими операторами. Они также называются логическими операторами «краткой записи». выражение_условного_И: выражение_условного_ИЛИ: Операторы && и || являются условными версиями операторов & и |. · Операция x && y соответствует операции x & y, за исключением того, что y вычисляется, только если x не равен false. · Операция x || y соответствует операции x | y, за исключением того, что y вычисляется, только если x не равен true. Если операнд условного логического оператора имеет динамический тип во время компиляции, то он динамически связан (§7.2.2). В этом случае тип времени компиляции выражения динамический, а разрешение, приведенное ниже, будет иметь место во время выполнения при использовании типа времени выполнения тех операндов, которые имеют динамический тип во время компиляции. Операция вида x && y или x || y обрабатывается с применением разрешения перегрузки (§7.3.4), как если бы операция записывалась в виде x & y или x | y. Тогда · Если при разрешении перегрузки не удается найти один наилучший оператор или выбирается один из стандартных логических операторов для целых чисел, то возникает ошибка времени привязки. · Иначе, если выбранный оператор является одним из стандартных логических операторов (§7.11.3) или обнуляемых логических операторов (§7.11.4), то операция выполняется, как описано в разделе §7.12.1. · Иначе выбранный оператор является пользовательским оператором, и операция выполняется, как описано в разделе §7.12.2.
|