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

5.3.3.27?? Выражения ??

Для выражения expr в форме expr-first ?? expr-second:

  • состояние определенного присваивания переменной v перед выражением expr-first соответствует состоянию определенного присваивания переменной v перед выражением expr;

  • состояние определенного присваивания переменной v перед выражением expr-second соответствует состоянию определенного присваивания этой переменной после выражения expr-first.

  • состояние определенного присваивания переменной v после выражения expr определяется следующими факторами:

  • если выражение expr-first является константным выражением (§7.19), имеющим значение null, состояние переменной v после выражения expr соответствует ее состоянию после выражения expr-second;

  • В обратном случае состояние переменной v после выражения expr соответствует состоянию определенного присваивания этой переменной после выражения expr-first.

5.3.3.28Выражения ?:

Для выражения expr в форме expr-cond ? expr-true : expr-false:

  • состояние определенного присваивания переменной v перед выражением expr-cond соответствует состоянию этой переменной перед выражением expr;

  • переменная v перед выражением expr-true является определенно присвоенной только в том случае, если эта переменная после выражения expr-cond имеет состояние определенно присвоенной или «определенно присвоенной в результате выполнения выражения с итогом true»;

  • переменная v перед выражением expr-false является определенно присвоенной только в том случае, если эта переменная после выражения expr-cond имеет состояние определенно присвоенной или «определенно присвоенной в результате выполнения выражения с итогом false»;

  • состояние определенного присваивания переменной v после выражения expr определяется следующими правилами:

  • если выражение expr-cond является константным выражением (§7.19), имеющим значение true, состояние переменной v после выражения expr соответствует состоянию этой переменной после выражения expr-true;

  • в обратном случае, если выражение expr-cond является константным выражением (§7.19), имеющим значение false, состояние переменной v после выражения expr соответствует состоянию этой переменной после выражения expr-false;

  • в обратном случае, если переменная v является определенно присвоенной как после выражения expr-true, так и после выражения expr-false, эта переменная после выражения expr также является определенно присвоенной;

  • в обратном случае переменная v после выражения expr не является определенно присвоенной.

5.3.3.29Анонимные функции

Для лямбда-выражений или выражений_ананимного_метода expr с телом, содержащим блок или выражение:

  • Состояние определенного присваивания внешней переменной v перед телом body соответствует состоянию этой переменной перед выражением expr. Таким образом, состояние определенного присваивания внешних переменных наследуется из контекста анонимной функции.

  • Состояние определенного присваивания внешней переменной v после выражения expr соответствует состоянию этой переменной перед выражением expr.

Например:

delegate bool Filter(int i);

void F() { int max;

// Error, max is not definitely assigned Filter f = (int n) => n < max;

max = 5; DoWork(f); }

Этот пример приводит к возникновению ошибки времени компиляции, поскольку переменная max не является определенно присвоенной при объявлении анонимной функции. Например:

delegate void D();

void F() { int n; D d = () => { n = 1; };

d();

// Error, n is not definitely assigned Console.WriteLine(n); }

Этот пример также приводит к возникновению ошибки времени компилирования, поскольку присваивание для переменной n в анонимной функции не влияет на состояние определенного присваивания переменной n вне анонимной функции.

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