TryParse con out var param


Una nueva característica en C# 6.0 permite declarar variable 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: introduzca la descripción de la imagen aquí

¿Qué estoy haciendo mal? P.d.: en la configuración del proyecto se establecen C# 6.0 y. NET framework 4.6.

Author: kame, 2015-07-30

3 answers

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

Las expresiones de declaración se cortaron 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 ver este para referencia futura).

Actualización (07/03/2017)

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

string s = "42";

if (int.TryParse(s, out var result))
{
     Console.WriteLine(result);
}
 132
Author: Yuval Itzchakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 14:16:43

Acaba de enterarse por accidente, en vs2017, puede hacer esto por brevedad:

if (!Int64.TryParse(id, out _)) {
   // error or whatever...
}
 10
Author: Fat Shogun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-24 15:00:07

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 en 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 se está volviendo extremadamente larga para ningún 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 no hacer nada. El número de líneas se puede cortar por 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 ámbito donde no desea tenerlas. Esto le impide utilizar una variable que no tenía la intención de utilizar, pero que es visible para usted ahora.

Esta característica también es útil con la coincidencia de patrones en las sentencias 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; }
}
 7
Author: Patrick Hofman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-22 05:01:14