TryParse без параметра var


93

Новая функция в C # 6.0 позволяет объявлять переменную внутри метода TryParse. У меня есть код:

string s = "Hello";

if (int.TryParse(s, out var result))
{

}

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

Что я делаю не так? PS: в настройках проекта заданы C # 6.0 и .NET framework 4.6.

Ответы:


152

Новая функция в C # 6.0 позволяет объявлять переменную внутри метода TryParse.

Выражения объявления были вырезаны из C # 6.0 и не поставлялись в окончательной версии. В настоящее время вы не можете этого сделать. Для этого есть предложение на GitHub для C # 7 (также см. Это для справок в будущем).

Обновление (03.07.2017)

В официальном выпуске C # 7 компилируется следующий код:

string s = "42";

if (int.TryParse(s, out var result))
{
     Console.WriteLine(result);
}

4
Большое спасибо за информацию! Жалко, что он вырезан из финального релиза, как по мне, это приятная особенность.
Anton23

2
@ Anton23 Будем надеяться, что тогда он попадет в C # 7 :)
Yuval Itzchakov

2
Для меня это была самая ожидаемая особенность.
Tuyen Pham

По крайней мере, он есть в C # 7 / VS2017.
ssmith

1
Вы не могли бы прочитать буквально еще одно предложение? Ответ, в котором говорится о C # 7, также объясняет, что он был сокращен с версии 6.0. Люди все еще развиваются на C # 6.0
Fus Ro Dah


9

Это новая функция C # 7, которая является очень хорошей функцией, часто используемой в сочетании с сопоставлением с образцом. Об этой и многих других функциях объявлено в блоге группы разработчиков C # Что нового в C # 7.0 .

Команда пытается добиться более гибкого кода. Вы помните случаи, когда список выходных переменных становился очень длинным и бесполезным? Просто быстрый пример:

int i;
Guid g;
DateTime d;
if (int.TryParse(o, out i)) { /*use i*/ }
else if (Guid.TryParse(o, out g)) { /*use g*/ }
else if (DateTime.TryParse(o, out d)) { /*use d*/ }

Видите проблему? Бесполезно, чтобы все эти выходные переменные ничего не делали. Количество строк можно сократить вдвое с помощью C # 7:

if (int.TryParse(o, out int i)) { /*use i*/ }
else if (Guid.TryParse(o, out Guid g)) { /*use g*/ }
else if (DateTime.TryParse(o, out DateTime d)) { /*use d*/ }

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

Эта функция также полезна при сопоставлении с образцом в switchоператорах, как в этом коде (который имеет другое поведение, чем приведенный выше код!):

switch (o)
{
    case int i: { /*use i*/ break; }
    case Guid g: { /*use g*/ break; }
    case DateTime d: { /*use d*/ break; }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.