TryParse bez parametru var


93

Nowa funkcja w C # 6.0 pozwala zadeklarować zmienną wewnątrz metody TryParse. Mam kod:

string s = "Hello";

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

}

Ale otrzymuję błędy kompilacji: wprowadź opis obrazu tutaj

Co robię źle? PS: w ustawieniach projektu są ustawione C # 6.0 i .NET Framework 4.6.

Odpowiedzi:


152

Nowa funkcja w C # 6.0 pozwala zadeklarować zmienną wewnątrz metody TryParse.

Wyrażenia deklaracji zostały wycięte z języka C # 6,0 i nie zostały wysłane w ostatecznej wersji. Obecnie nie możesz tego zrobić. Jest to propozycja dla niego na GitHub dla C # 7 (patrz również ten dla odniesienia w przyszłości).

Aktualizacja (07.03.2017)

Wraz z oficjalnym wydaniem C # 7 kompilowany jest następujący kod:

string s = "42";

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

4
Wielkie dzięki za informację! Szkoda, że ​​został wycięty z ostatniego wydania, bo dla mnie to fajna funkcja.
Anton

2
@ Anton23 Miejmy nadzieję, że w takim razie trafi do C # 7 :)
Yuval Itzchakov

2
To była najbardziej oczekiwana funkcja dla mnie.
Tuyen Pham

Jest przynajmniej w C # 7 / VS2017.
ssmith

1
Nie mogłeś przeczytać, dosłownie, jeszcze jednego zdania? Odpowiedź, która podaje C # 7, wyjaśnia również, że została wycięta z wersji 6.0. Ludzie wciąż się rozwijają w C # 6.0
Fus Ro Dah,

15

Właśnie dowiedziałem się przypadkiem, w vs2017 możesz to zrobić dla zwięzłości:

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

2
To jest operator odrzucenia.
Patrick Hofman,

9

To jest nowa funkcja z C # 7, która jest bardzo fajną funkcją często używaną w połączeniu z dopasowywaniem wzorców. Ta funkcja i wiele innych są ogłoszone w blogu zespołu języka C # Co nowego w języku C # 7.0 .

To, co zespół stara się osiągnąć, to bardziej płynny kod. Czy pamiętasz przypadki, w których lista naszych zmiennych staje się bardzo długa i nie nadaje się do użytku? Tylko krótki przykład:

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*/ }

Widzisz problem? Nie ma sensu, aby wszystkie te zmienne siedziały tam i nic nie robiły. Liczbę wierszy można zmniejszyć o połowę za pomocą 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*/ }

Nie tylko liczba linii jest zminimalizowana, ale także nie ma zbędnej listy zmiennych w zakresie, w których nie chcesz ich mieć. Uniemożliwia to użycie zmiennej, której nie zamierzałeś użyć, ale która jest teraz dla Ciebie widoczna.

Ta funkcja jest również przydatna przy dopasowywaniu wzorców w switchinstrukcjach, jak w tym kodzie (który zachowuje się inaczej niż powyższy kod!):

switch (o)
{
    case int i: { /*use i*/ break; }
    case Guid g: { /*use g*/ break; }
    case DateTime d: { /*use d*/ break; }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.