TryParse sem var param

93

Um novo recurso do C # 6.0 permite declarar variáveis ​​dentro do método TryParse. Eu tenho algum código:

string s = "Hello";

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

}

Mas recebo erros de compilação: insira a descrição da imagem aqui

O que estou fazendo errado? PS: nas configurações do projeto estão definidos C # 6.0 e .NET framework 4.6.

Anton23
fonte

Respostas:

152

Um novo recurso do C # 6.0 permite declarar variáveis ​​dentro do método TryParse.

As expressões de declaração foram cortadas do C # 6.0 e não foram enviadas na versão final. Atualmente você não pode fazer isso. Há uma proposta para ele no GitHub para C # 7 (ver também este para referência futura).

Atualização (03/07/2017)

Com o lançamento oficial do C # 7, o código a seguir é compilado:

string s = "42";

if (int.TryParse(s, out var result))
{
     Console.WriteLine(result);
}
Yuval Itzchakov
fonte
4
Muito obrigado pela informação! É uma pena que ele foi cortado na versão final, para mim é um bom recurso.
Anton23
2
@ Anton23 Vamos torcer para que ele entre em C # 7 então :)
Yuval Itzchakov
2
Esse era o recurso mais esperado para mim.
Tuyen Pham
Está em C # 7 / VS2017, pelo menos.
ssmith
1
Você não conseguiu ler, literalmente, mais uma frase? A resposta, que afirma C # 7, também explica que foi cortado do 6.0. As pessoas ainda desenvolvem em C # 6.0
Fus Ro Dah
15

Acabei de descobrir por acidente, no vs2017, você pode fazer isso por brevidade:

if (!Int64.TryParse(id, out _)) {
   // error or whatever...
}
Shogun Gordo
fonte
2
Esse é o operador de descarte.
Patrick Hofman
9

Esse é um novo recurso do C # 7, que é um recurso muito bom frequentemente usado em conjunto com a correspondência de padrões. Esse recurso, e muitos mais, são anunciados no blog da equipe do C # Novidades no C # 7.0 .

O que a equipe tenta alcançar aqui é um código mais fluido. Você se lembra de alguns casos em que a lista de variáveis ​​externas está ficando extremamente longa e sem uso? Apenas um exemplo 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*/ }

Vê o problema? É inútil ter todas essas variáveis ​​de fora sentadas sem fazer nada. O número de linhas pode ser cortado pela metade 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*/ }

Não apenas o número de linhas é minimizado, mas também não há uma lista desnecessária de variáveis ​​no escopo onde você não deseja tê-las. Isso evita que você use uma variável que não pretendia usar, mas que agora está visível para você.

Esse recurso também é útil com correspondência de padrões em switchinstruções, como neste código (que tem um comportamento diferente do código acima!):

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