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 тоді :)
Юваль Ітчаков

2
Це було найбільше очікування для мене.
Туйен Фам

Це, принаймні, в 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.