Esse é o 13º post da série sobre C# 7, e o 3º sobre C# 7.1. Pra acompanhar a série você pode seguir a tag C#7 no blog ou voltar no post que agrega a série.

Lembrando que para utilizar as versões minor do C# (como a 7.1, ou 7.2) você precisa habilitá-la nos atributos do projeto. Veja neste post como fazê-lo e também como habilitar na solution inteira pra não ter que ficar configurando cada projeto individualmente.

Novidades do C# 7.1: Inferência dos nomes de elementos de tuplas

Até a versão 7.1 do C# você era obrigado a declarar os nomes dos elementos de uma tupla, mesmo que o nome fosse possivelmente inferido a partir da expressão que está sendo utilizada para inicializar a tupla.

Por exemplo, veja como era até o C# 7.0, sem a inferência:

var quantidade = 10;
var total = 5;
var tupla = (quantidade: quantidade, total: total);

E como ficou no C# 7.1, com a inferência:

var quantidade = 10;
var total = 5;
var tupla = (quantidade, total);

E o valor pode ser inferido além de variáveis simples. O valor utilizado é sempre a partir da expressão, obtendo de forma inteligente, por exemplo, o nome da variável, ou nome da propriedade. Aqui temos outro exemplo utilizando propriedades de uma classe:

class Valores
{
    public int Quantidade {get; set; }
    public int Total { get; set; }
}
var v = new Valores { Quantidade = 10, Total = 5 };
var t = (v.Quantidade, v.Total); // (10, 5)
WriteLine($"Quantidade: {t.Quantidade}, Total: {t.Total}");
// escreve: "Quantidade: 10, Total: 5"

Fique atento com a chamada de funções. Se o total fosse obtido a partir de uma função, o elemento ficará sem nome. Por exemplo:

var t = (v.Quantidade, v.GetTotal());

Nesse caso, a tupla possui um elemento nomeado, Quantidade, e outro sem nome, que terá que ser acessado via Item2, que não é o comportamento esperado. Nesse caso é ainda possível nomear somente o segundo elemento, desta forma:

var t = (v.Quantidade, Total: v.GetTotal());

Assim como o exemplo do post anterior, sobre default literal expressions, esse é mais um exemplo de funcionalidade pequena e simples que tem um impacto razoável, já que o código fica mais limpo e gastamos menos tempo no teclado. É sem dúvida alguma fruto da reescrita do compilador do C# em C#, que permite essas pequenas evoluções, que saem quase de graça.

Você consegue ler mais sobre a inferência de nomes de tuplas nos docs sobre as novidades do C# 7.1.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.