2016-11-18 6 views
6

В Roslyn Pattern Matching spec говорится, что:шаблон матча переменная сфера

Область действия переменной шаблона выглядит следующим образом:

Если рисунок появляется в состоянии, если заявление, сфера его применения является условие и управляемый оператор оператора if, но не его предложение else.

Однако последняя Microsoft «Что нового» posts и presentations показывают этот пример:

public void PrintStars(object o) 
{ 
    if (o is null) return;  // constant pattern "null" 
    if (!(o is int i)) return; // type pattern "int i" 
    WriteLine(new string('*', i)); 
} 

который показывает сопоставление с образцом i переменной, используемой вне, если уровень охвата матча картины.

Является ли это надзором или область обзора изменена?

+0

Это будет контрольная инструкция оператора if – juharr

+0

@juharr, не будет ли возвращено контролируемое заявление? –

+0

Да, я пропустил это. Я на самом деле думаю, что это может означать «i» в более широком диапазоне, но это сложно сказать, поскольку это фрагмент кода для бета-функциональности. Наверное, вы можете получить предварительный просмотр и проверить его. – juharr

ответ

3

Я отправил a similar question к вопросам Roslyn и был дан ответ на DavidArno:

Это долго, но вы можете прочитать все кровавые подробности о том, почему команда проектировщиков языка решили «усилить» язык таким образом: #12939.

TL; DR Вы не одиноки в том, чтобы думать об изменениях неинтуитивно и , что противоречило тому, как область работы работала раньше. Команда печально все равно, и изменение здесь, чтобы остаться.

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

Вариант 3: переменные Экспрессирующая областью действия по блоки, для, Еогеаспа и с использованием отчетности, а также все вложенных утверждений:

что подразумевается под вложенным оператором здесь, это тот, который используется в качестве вложенного оператора в другом заявлении - за исключением внутри блока. Таким образом, ветви оператора if, тела while, foreach и т. Д. будут считаться встроенными.

В результате переменные всегда будут покидать условие a if, но никогда его ветви. Это как если бы вы ставили колышки во всех местах, где вы «должны были».

Заключение

Хотя вариант немного тонкие, мы примем 3. Она поражает хороший баланс :

Это позволяет ключевым сценарии, в том числе из VARS для не попробовать методы, а также модели и из варов в вышибалах if-statements. Это не приводит к вопиющим и противоинтуитивным многоуровневым «проливаниям». Это означает, что вы получите больше переменных в объеме, чем текущий ограничивающий режим . Это не кажется опасным, потому что определенный анализ назначений предотвратит неинициализированное использование. Однако он предотвращает повторное использование имен переменных и приводит к большему количеству имен , отображаемых в списках завершения. Это кажется разумным компромиссом.

2

Из той же документации:

переменные, введенные шаблон - аналогичны переменным, выполненной ранее описанных

Так на самом деле этот код:

if (!(o is int i)) return; // type pattern "int i" 

является более или менее:

int i; 
if (!(SomeParsingOn(o, out i))) return; // type pattern "int i" 

Это означает, что i объявлен на том же уровне, что и if, что означает, что он находится в области не только для if, но и для следующих операторов. То, что это правда, может быть seens при копировании if:

if (!(o is int i)) return; // type pattern "int i" 
if (!(o is int i)) return; // type pattern "int i" 

дает ошибки CS0128: локальная переменная с именем «я» уже определена в этой области.

+0

Спасибо за проверку кода с предварительным просмотром! Это, похоже, противоречит спецификационному документу, я буду искать github для любого упоминания об изменении. Лично мне не нравится это определение, поскольку оно не соответствует большинству других синтаксисов, где определены переменные (catch & use). –

+1

Ну да, вы правы. Это неловко. Надеюсь, они исправит это. Может быть, это просто ошибка, может быть, это незавершенное производство. –

Смежные вопросы