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.