Una nueva función en C# 6.0 permite declarar variables dentro del método TryParse. tengo algo de codigo:
string s = "Hello"; if (int.TryParse(s, out var result)) { } Pero recibo errores de compilación: 
¿Que estoy haciendo mal? PD: en la configuración del proyecto se establecen C# 6.0 y .NET framework 4.6.
Una nueva función en C# 6.0 permite declarar variables dentro del método TryParse.
Las expresiones de declaración se eliminaron de C# 6.0 y no se incluyeron en la versión final. Actualmente no puedes hacer eso. Hay una propuesta para ello en GitHub para C# 7 (también vea esto para futuras referencias).
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); }Me acabo de enterar por accidente, en vs2017, puedes hacer esto por brevedad:
if (!Int64.TryParse(id, out _)) { // error or whatever... }Esa es una característica nueva de C# 7, que es una característica muy buena que se usa a menudo junto con la coincidencia de patrones. Esta función, 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 fuera se vuelve extremadamente larga sin ningún uso? Sólo 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 fuera sentadas allí 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 la cantidad de líneas, sino que tampoco hay una lista innecesaria de variables en el alcance donde no desea tenerlas. Esto le impide usar una variable que no pretendía usar, pero que ahora puede ver.
Esta característica también es útil con la coincidencia de patrones en declaraciones de switch , 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; } }