TryParse sin var param

93

Una nueva característica en C # 6.0 permite declarar variables dentro del método TryParse. Tengo un código:

string s = "Hello";

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

}

Pero recibo errores de compilación: ingrese la descripción de la imagen aquí

¿Que estoy haciendo mal? PD: en la configuración del proyecto se establecen C # 6.0 y .NET framework 4.6.

Anton23
fuente

Respuestas:

152

Una nueva característica en C # 6.0 permite declarar variables dentro del método TryParse.

Las expresiones de declaración se cortaron de C # 6.0 y no se enviaron en la versión final. Actualmente no puedes hacer eso. Hay una propuesta para ello en GitHub para C # 7 (vea también esto para referencia futura).

Actualización (03/07/2017)

Con el lanzamiento oficial de C # 7, se compila el siguiente código:

string s = "42";

if (int.TryParse(s, out var result))
{
     Console.WriteLine(result);
}
Yuval Itzchakov
fuente
4
¡Muchas gracias por la información! Es una lástima que se haya eliminado del lanzamiento final, ya que para mí es una buena característica.
Anton23
2
@ Anton23 Esperemos que entre en C # 7 entonces :)
Yuval Itzchakov
2
Esa fue la característica más esperada para mí.
Tuyen Pham
Está en C # 7 / VS2017, al menos.
ssmith
1
¿No pudiste seguir leyendo, literalmente, una frase más? La respuesta, que indica C # 7, también explica que se eliminó de 6.0. La gente todavía se desarrolla en C # 6.0
Fus Ro Dah
15

Me enteré por accidente, en vs2017, puede hacer esto por brevedad:

if (!Int64.TryParse(id, out _)) {
   // error or whatever...
}
Shogun gordo
fuente
2
Ese es el operador de descarte.
Patrick Hofman
9

Esa es una nueva característica de C # 7, que es una característica muy agradable que se usa a menudo junto con la coincidencia de patrones. Esta característica, y muchas más, se anuncian en el blog del equipo de C # Novedades de C # 7.0 .

Lo que el equipo intenta lograr aquí es un código más fluido. ¿Recuerda algunos casos en los que la lista de variables de salida se está volviendo extremadamente larga sin uso? Solo un ejemplo rápido:

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

¿Ves el problema? Es inútil tener todas esas variables ahí sentadas sin hacer nada. El número de líneas se puede reducir a la mitad usando 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*/ }

No solo se minimiza el número de líneas, tampoco hay una lista innecesaria de variables en el alcance donde no desea tenerlas. Esto le impide utilizar una variable que no tenía la intención de utilizar, pero que ahora está visible.

Esta característica también es útil con la coincidencia de patrones en switchdeclaraciones, como en este código (¡que tiene un comportamiento diferente al código anterior!):

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