Novidades do C# 7.1

O objetivo deste artigo é apresentar as novidades que integram o C# 7.1, assim como demonstrar o procedimento para ativar tais recursos podem a partir do Visual Studio 2017 Update 15.3.
Habilitando o uso do C# 7.1 no Visual Studio 2017
Caso o uso do C# 7.1 não tenha sido previamente habilitado, um alerta aparecerá no Visual Studio 2017 ao se tentar empregar um dos novos recursos:

Para evitar este tipo de problema será necessário alterar as propriedades do projeto em questão. Na seção Build acionar a opção Advanced…:

Aparecerá neste momento a janela Advanced Build Settings, com a opção C# latest major version (default) selecionada:

Método Main assíncrono
Até o C# 7.0 não era possível definir o método Main na classe Program de uma aplicação como assíncrono (muito embora existissem meios para emular tal comportamento). As seguir estão listadas as sobrecargas possíveis antes da versão 7.1:
Já o C# 7.1 permite que esta operação seja declarada como assíncrona, trazendo assim novas possibilidades para a implementação desta função:
A próxima listagem apresenta um exemplo de implementação assíncrona do método Main, com isto acontecendo em uma API REST criada com o ASP.NET Core 2.0:
Inferindo os nomes de propriedades em tuplas
Ao se criar tuplas a partir de objetos pré-existentes o C# 7.0 assumia por convenção os valores Item1, Item2 e assim por diante (de acordo com a quantidade de itens presentes) como identificação das propriedades retornadas. A seguir podemos observar um exemplo deste comportamento:
Uma alternativa a isto seria especificar o nome de cada propriedade no momento da criação das tuplas (para este exemplo foram utilizados Name e FullName):
A capacidade de inferir os nomes de propriedades em tuplas é uma das novidades do C# 7.1. Graças a tal funcionalidade o exemplo abordado nesta seção ficaria da seguinte forma:
O resultado da execução deste trecho de código pode ser observado na próxima imagem:

Pattern Matching com tipos genéricos
Um dos destaques durante o lançamento do C# 7.0 foi o recurso conhecido como Pattern Matching, o qual simplificou o processo de checagem de tipos. Entretanto, essa capacidade não estava disponível para o uso com Generics.
Na listagem a seguir o método ConverterData ilustra esta limitação, com o mesmo possuindo um parâmetro definindo como sendo do tipo object:
Já a próxima listagem traz este código refatorado, demonstrando assim o uso de Pattern Matching com tipos genéricos no método ConvertarData:
Como resultado da execução deste último exemplo temos:

Default expressions
Em versões anteriores da linguagem C# a palavra-chave default podia ser empregada para retornar o valor padrão de um tipo. Tal prática exigia que o tipo em questão fosse informado como parâmetro a este operador, conforme indicado na próxima listagem:
Com o C# 7.1 basta agora apenas especificar o operador default. Instruções deste tipo são chamadas de default expressions, com a sua utilização acontecendo:
- Em operações envolvendo ternários;
- Como retorno em funções e expressões lambda;
- Como valor default em métodos que possuam parâmetros opcionais;
- Na inicialização de arrays, variáveis e constantes.
A listagem a seguir traz o exemplo desta seção já refatorado, de forma a demonstrar o uso de default expressions:
Ao executar este exemplo aparecerá o seguinte resultado:

Os diversos exemplos de uso do C# 7.1 abordados neste artigo foram também disponibilizados no GitHub:
