TryParse sans var param

93

Une nouvelle fonctionnalité en 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: entrez la description de l'image ici

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.

Anton23
la source

Réponses:

152

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

Les expressions de déclaration ont été supprimées de C # 6.0 et n'ont pas été fournies dans la version finale. Vous ne pouvez pas faire ça actuellement. Il y a une proposition pour cela sur GitHub pour C # 7 (voir également ceci pour référence future).

Mise à jour (07/03/2017)

Avec la version officielle de C # 7, le code suivant se compile:

string s = "42";

if (int.TryParse(s, out var result))
{
     Console.WriteLine(result);
}
Yuval Itzchakov
la source
4
Merci beaucoup pour les informations! C'est dommage qu'il ait été coupé de la version finale, car pour moi c'est une fonctionnalité intéressante.
Anton23
2
@ Anton23 Espérons qu'il entre en C # 7 alors :)
Yuval Itzchakov
2
C'était la fonctionnalité la plus attendue pour moi.
Tuyen Pham
C'est au moins en C # 7 / VS2017.
ssmith
1
Vous ne pouviez pas lire, littéralement, une phrase de plus? La réponse, qui indique C # 7, explique également qu'il a été coupé de 6.0. Les gens se développent encore en C # 6.0
Fus Ro Dah
15

Je viens de le découvrir par accident, dans vs2017, vous pouvez le faire par souci de concision:

if (!Int64.TryParse(id, out _)) {
   // error or whatever...
}
Gros shogun
la source
2
C'est l'opérateur de rejet.
Patrick Hofman
9

C'est une nouvelle fonctionnalité de C # 7, qui est une fonctionnalité très intéressante souvent utilisée en conjonction avec la correspondance de motifs. Cette fonctionnalité, et bien d'autres, est annoncée dans le blog de l'équipe C # What's New in C # 7.0 .

Ce que l'équipe essaie de réaliser ici, c'est un code plus fluide. Vous souvenez-vous de certains cas où la liste des variables out devient extrêmement longue sans aucune utilité? 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*/ }

Vous voyez le problème? Il est inutile d'avoir toutes ces variables out assis là à ne 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é, mais il n'y a pas non plus de liste inutile de variables dans la portée où vous ne voulez pas les avoir. Cela vous empêche d'utiliser une variable que vous n'aviez pas l'intention d'utiliser, mais qui vous est désormais visible.

Cette fonctionnalité est également utile avec la correspondance de modèle dans les switchinstructions, comme dans ce code (qui a un comportement 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; }
}
Patrick Hofman
la source