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

7.13Оператор слияния с null

Оператор ?? называется оператором слияния с null.

выражение_слияния_с_null: выражение_условного_ИЛИ выражение_условного_ИЛИ ?? выражение_слияния_с_null

В выражении слияния с null вида a ?? b требуется, чтобы a имело обнуляемый тип или ссылочный тип. Если a не равно null, то результатом a ?? b является a, в противном случае результатом является b. В операции вычисление b происходит, только если a равно null.

Оператор слияния с null имеет правую ассоциативность, что означает, что операции группируются справа налево. Например, выражение вида a ?? b ?? c вычисляется как a ?? (b ?? c). В общем случае выражение вида E1 ?? E2 ?? ... ?? EN возвращает первый операнд, не равный null, или null, если все операнды равны null.

Тип выражения a ?? b зависит от того, какие неявные преобразования доступны с операндами. В порядке предпочтения тип a ?? b равен A0, A или B, где A имеет тип a (при условии, что у a есть тип), B имеет тип b (при условии, что у b есть тип), а A0 является базовым типом A, если A является обнуляемым типом, либо равен типу A в противном случае. В частности, a ?? b обрабатывается следующим образом.

  • Если A существует и не является обнуляемым типом или ссылочным типом, возникает ошибка времени компиляции.

  • Если b является динамическим выражением, то тип результата будет динамическим. Во время выполнения сначала вычисляется a. Если a не равно null, для a выполняется преобразование в динамическое, и это становится результатом. Иначе вычисляется b и это становится результатом.

  • Иначе, если A существует и является обнуляемым типом и существует неявное преобразование из b в A0, то типом результата будет A0. Во время выполнения сначала вычисляется a. Если a не равно null, для a выполняется снятие упаковки до типа A0 и это становится результатом. Иначе вычисляется b и преобразуется в тип A0 и это становится результатом.

  • Иначе, если существует A и существует неявное преобразование из b в A, то типом результата будет A. Во время выполнения сначала вычисляется a. Если a не равно null, a становится результатом. Иначе вычисляется b и преобразуется в тип A и это становится результатом.

  • Иначе, если b имеет тип B и существует неявное преобразование из a в B, то типом результата будет B. Во время выполнения сначала вычисляется a. Если a не равно null, для a выполняется снятие упаковки до типа A0 (если только A существует и является обнуляемым), оно преобразуется в тип B и это становится результатом. Иначе вычисляется b и это становится результатом.

  • Иначе a и b являются несовместимыми и возникает ошибка времени компиляции.

7.14Условный оператор

Оператор ?: называется условным оператором. Иногда его также называют тернарным оператором.

conditional-expression: null-coalescing-expression null-coalescing-expression ? expression : expression

В условном выражении вида b ? x : y сначала вычисляется условие b. Затем, если b равно true, вычисляется x и это становится результатом операции. Иначе вычисляется y и это становится результатом операции. В условном выражении никогда не выполняется вычисление и x, и y.

Условный оператор имеет правую ассоциативность, что означает, что операции группируются справа налево. Например, выражение вида a ? b : c ? d : e вычисляется как a ? b : (c ? d : e).

Первый операнд оператора ?: должен быть выражением с типом, который можно неявно преобразовать в тип bool, или выражением типа, в котором реализован оператор operator true. Если не выполняется ни одно из этих требований, то возникает ошибка времени компиляции.

Второй и третий операнды оператора, x и y, ?: задают тип условного выражения.

  • Если x имеет тип X, а y имеет тип Y, то

  • Если из X в Y существует неявное преобразование (§6.1), а из Y в X не существует, то типом условного выражения является Y.

  • Если из Y в X существует неявное преобразование (§6.1), а из X в Y не существует, то типом условного выражения является X.

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

  • Если только один из x и y имеет тип, и оба x и y могут быть неявно преобразованы в этот тип, то он является типом условного выражения.

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

Во время выполнения обработка условного выражения вида b ? x : y включает следующие этапы.

  • Сначала вычисляется b и определяется логическое значение b:

  • Если существует неявное преобразование из типа b в bool, то для получения логического значения выполняется это неявное преобразование.

  • Иначе для получения логического значения вызывается оператор operator true, определенный в типе b.

  • Если полученное на предыдущем этапе логическое значение равно true, то x вычисляется и преобразуется в тип условного выражения и это становится результатом условного выражения.

  • Иначе y вычисляется и преобразуется в тип условного выражения и это становится результатом условного выражения.

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