Метод tryparse с Вар парам


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

string s = "Hello";

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

}

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

Что я делаю не так? P. S.: В настройках проекта C# 6.0 и .Чистая Framework 4.6 и устанавливаются.

3 81

3 ответа:

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

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

Обновление (07/03/2017)

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

string s = "42";

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

Просто случайно узнал, в vs2017, это можно сделать для краткости:

if (!Int64.TryParse(id, out _)) {
   // error or whatever...
}

Это новая функция из C# 7, которая является очень хорошей функцией, часто используемой в сочетании с сопоставлением шаблонов. Эта функция и многие другие анонсируются в блоге команды C# What's New in C# 7.0.

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

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; }
}