Пространство объявления блочного уровня оператора выбора в C#

Принятый ответ не работает на 4.1.2. Это должно работать на всех платформах:

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
            "mailto","abc@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Body");
startActivity(Intent.createChooser(emailIntent, "Send email..."));

Надеюсь, это поможет.

Обновление: Согласно marcwjj , кажется, что на 4.3 нам нужно передать массив строк вместо строки для адреса электронной почты, чтобы он работал. Возможно, нам понадобится добавить еще одну строку:

intent.putExtra(Intent.EXTRA_EMAIL, addresses); // String[] addresses

Ссылка

7
задан Jeff B 30 August 2016 в 14:53
поделиться

5 ответов

ОБНОВЛЕНИЕ: этот вопрос послужил источником вдохновения для этого сообщения в блоге; см. его для получения дополнительной информации.

http://ericlippert.com/2009/08/13/four-switch-oddities/

Спасибо за интересный вопрос.


Существует ряд недоразумений и ошибок. утверждения в различных других ответах, ни один из которых на самом деле не объясняет, почему это незаконно. Я попытаюсь быть окончательным.

Во-первых, чтобы быть точным, «масштаб» - неправильное слово для описания проблемы. По совпадению, на прошлой неделе я написал в блоге сообщение об этом точном неправильном использовании слова «scope»; который будет опубликован после моей серии статей о блоках итераторов, которые будут проходить в течение июля.

Правильный термин: « пространство объявлений ». Пространство объявлений - это область кода, в которой нельзя объявить две разные вещи с одинаковыми именами . Описанный здесь сценарий является симптомом того факта, что секция коммутатора не определяет пространство объявлений, хотя блок коммутатора определяет. Поскольку два объявления OP находятся в одном пространстве объявлений и имеют одинаковое имя, они являются незаконными.

(Да, блок переключателей также определяет область действия, но этот факт не имеет отношения к вопросу, потому что вопрос касается законности объявления , а не семантика поиска идентификатора .)

Резонный вопрос: «Почему это незаконно?» Разумный ответ - «ну с чего же»? Вы можете получить это одним из двух способов. Либо это допустимо:

switch(y)
{
case 1:  int x = 123; ... break;
case 2:  int x = 456; ... break;
}

, либо допустимо:

switch(y)
{
case 1:  int x = 123; ... break;
case 2:  x = 456; ... break;
}

, но вы не можете получить оба способов. Разработчики C # выбрали второй способ, который казался более естественным.

Это решение было принято 7 июля 1999 г., всего десять лет назад. Комментарии в примечаниях того дня очень краткие, просто заявляя: « Switch-case не создает свое собственное пространство объявлений », а затем даем пример кода, который показывает, что работает, а что нет.

Чтобы узнать больше о том, что было в головах дизайнеров в этот день, я мне приходилось беспокоить многих людей о том, что они думали десять лет назад, и беспокоить их о том, что в конечном итоге является тривиальной проблемой; Я не собираюсь этого делать.

Короче говоря, не существует особенно веских причин для выбора того или иного пути; оба имеют достоинства. Команда разработчиков языка выбрала один путь, потому что они должны были выбрать один; тот, который они выбрали, кажется мне разумным.

32
ответ дан 6 December 2019 в 04:55
поделиться

А, вы не провалились, но вы можете использовать goto для перехода к другому помеченному блоку case. Следовательно, блоки должны быть в одном объеме.

8
ответ дан 6 December 2019 в 04:55
поделиться

Вы также можете:

case x:
  {var someVariable = 42;}
break;
case y: 
   {var someVariable = 40;}
break;

По сути, фигурные скобки создают лексическую область видимости, поэтому без фигурных скобок someVariable загружается в таблицу символов дважды. Я считаю, что этот выбор, вероятно, сделан просто для того, чтобы избежать путаницы и, возможно, чтобы не усложнять построение таблицы символов.

3
ответ дан 6 December 2019 в 04:55
поделиться

Вы можете просто объявить переменную вне области действия оператора switch.

var someVariable;

switch();
case x:   
someVariable = 42;
break; 
case y:     
someVariable = 40;
break;
0
ответ дан 6 December 2019 в 04:55
поделиться

Поскольку варианты не являются блоками, фигурные скобки, обозначающие область действия, отсутствуют. Случаи, за неимением лучшего слова, похожи на метки.

Лучше объявить переменную вне оператора switch () и использовать ее в дальнейшем. Конечно, в этом сценарии вы не сможете использовать ключевое слово var , потому что компилятор не будет знать, какой тип инициализировать.

2
ответ дан 6 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: