TryParse senza var param


93

Una nuova funzionalità in C # 6.0 consente di dichiarare la variabile all'interno del metodo TryParse. Ho del codice:

string s = "Hello";

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

}

Ma ricevo errori di compilazione: inserisci qui la descrizione dell'immagine

Cosa sto facendo di sbagliato? PS: nelle impostazioni del progetto sono impostati C # 6.0 e .NET framework 4.6.

Risposte:


152

Una nuova funzionalità in C # 6.0 consente di dichiarare la variabile all'interno del metodo TryParse.

Le espressioni di dichiarazione sono state tagliate da C # 6.0 e non sono state fornite nella versione finale. Al momento non puoi farlo. È disponibile una proposta in GitHub per C # 7 (vedere anche questo per riferimento futuro).

Aggiornamento (07/03/2017)

Con la versione ufficiale di C # 7, viene compilato il codice seguente:

string s = "42";

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

4
Grazie mille per le informazioni! È un peccato che sia stato tagliato dalla versione finale, poiché per me è una bella caratteristica.
Anton23

2
@ Anton23 Speriamo che entri in C # 7 allora :)
Yuval Itzchakov

2
Questa era la caratteristica più attesa per me.
Tuyen Pham,

Almeno in C # 7 / VS2017.
ssmith

1
Non potresti leggere, letteralmente, un'altra frase? La risposta, che indica C # 7, spiega anche che è stato tagliato da 6.0. Le persone si sviluppano ancora in C # 6.0
Fus Ro Dah

15

Appena scoperto per caso, in vs2017, puoi farlo per brevità:

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

2
Questo è l'operatore di scarto.
Patrick Hofman

9

Questa è una nuova funzionalità di C # 7, che è una funzionalità molto interessante spesso utilizzata insieme alla corrispondenza dei modelli. Questa funzionalità e molte altre sono annunciate nel blog del team di C # Novità di C # 7.0 .

La cosa che il team cerca di ottenere qui è un codice più fluido. Ricordi alcuni casi in cui l'elenco delle variabili out diventa estremamente lungo e inutile? Solo un rapido esempio:

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

Vedi il problema? È inutile che tutte quelle variabili esterne non facciano nulla. Il numero di righe può essere dimezzato utilizzando 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 solo il numero di righe è ridotto al minimo, non c'è nemmeno un elenco inutile di variabili nell'ambito di cui non si desidera averle. Ciò ti impedisce di utilizzare una variabile che non intendevi utilizzare, ma che ora è visibile.

Questa funzione è utile anche con la corrispondenza dei modelli nelle switchistruzioni, come in questo codice (che ha un comportamento diverso dal codice sopra!):

switch (o)
{
    case int i: { /*use i*/ break; }
    case Guid g: { /*use g*/ break; }
    case DateTime d: { /*use d*/ break; }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.