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

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

string s = "Hello";

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

}

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

Что я делаю неправильно? P.S.: в настройках проекта установлены С# 6.0 и .NET framework 4.6.

Ответ 1

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

Выражения для выражения были вырезаны из С# 6.0 и не были отправлены в окончательную версию. В настоящее время вы не можете этого сделать. Есть предложение для него на GitHub для С# 7 (также см. this для справок в будущем).

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

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

string s = "42";

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

Ответ 2

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

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

Ответ 3

Это новая функция от С# 7, которая является очень приятной функцией, часто используемой в сочетании с сопоставлением с образцом. Эта функция и многие другие объявлены в блоге команды С# Что нового в С# 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*/ }

Увидеть проблему? Бесполезно, чтобы все эти переменные сидели там, ничего не делая. Количество строк можно сократить пополам, используя С# 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; }
}