web-dev-qa-db-fra.com

TryParse with out var param

Une nouvelle fonctionnalité de C # 6.0 permet de déclarer une variable dans la méthode TryParse. J'ai du code:

string s = "Hello";

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

}

Mais je reçois des erreurs de compilation: enter image description here

Qu'est ce que je fais mal? PS: dans les paramètres du projet, C # 6.0 et .NET Framework 4.6 sont définis.

88
Anton23

Une nouvelle fonctionnalité de C # 6.0 permet de déclarer une variable dans la méthode TryParse.

Les expressions de déclaration ont été coupées de C # 6.0 et n'ont pas été incluses dans la version finale. Vous ne pouvez pas faire cela actuellement. Il y a une proposition à ce sujet sur GitHub pour C # 7 (voir aussi this pour référence future).

Mise à jour (07/03/2017)

Avec la version officielle de C # 7, le code suivant est compilé:

string s = "42";

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

Je viens de le découvrir par accident, en vs2017, vous pouvez le faire par souci de brièveté:

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

C’est une nouvelle fonctionnalité de C # 7, une fonctionnalité très agréable souvent utilisée en conjonction avec le filtrage par motif. Cette fonctionnalité, et bien d’autres encore, sont annoncées dans le blog de l’équipe C # Nouveautés de C # 7. .

Ce que l’équipe essaie de réaliser ici est un code plus fluide. Vous souvenez-vous de cas où la liste des variables out devient extrêmement longue et ne sert à rien? Juste un exemple rapide:

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

Voir le problème? Il est inutile d’avoir toutes ces variables extérieures sans rien faire. Le nombre de lignes peut être réduit de moitié en utilisant 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*/ }

Non seulement le nombre de lignes est minimisé, il n'y a pas non plus de liste inutile de variables dans la portée où vous ne souhaitez pas les avoir. Cela vous empêche d'utiliser une variable que vous n'aviez pas l'intention d'utiliser, mais qui est visible pour vous maintenant.

Cette fonctionnalité est également utile pour la recherche de motifs dans les instructions switch, comme dans ce code (dont le comportement est différent du code ci-dessus!):

switch (o)
{
    case int i: { /*use i*/ break; }
    case Guid g: { /*use g*/ break; }
    case DateTime d: { /*use d*/ break; }
}
9
Patrick Hofman