Mesmo que o C# 8.0 esteja a meses de seu lançamento, o planejamento já começou para a versão 8.x do C#. Alguns recursos são novos, outros foram já foram considerados na versão 8 do C#, e como sempre, a lista está sujeita a alterações.
Conforme discutido em um relatório anterior, o recurso Caller Expression Attribute permitiria que uma função capturasse a expressão usada para gerar os argumentos, sendo utilizada principalmente em declarações e testes automatizados.
A inferência de tipo para a nova palavra-chave, formalmente conhecida como Target-Typed new Expression, reduziria o código nas situações em que o nome do tipo pode ser determinado pelo contexto.
Embora a opinião atual seja de aproximadamente 3 a favor para 1 contra, a instrução Defer ainda está na lista de recursos que estão sendo considerados para uma versão 8.x.
Aperfeiçoamento do tipo comum Nullable
Na verdade, são duas solicitações, #33 e #881, que eliminam a necessidade de adicionar conversões explícitas ao trabalhar com tipos de valor nullable e operadores ternários. Na proposta do Nullable-Enhanced Common Type, os seguintes cenários seriam permitidos:
int a;
int? x1 = condition ? a : null;
int? b;
double c;
double? x2 = condition ? b : c;
Essa melhoria também seria suportada ao inferir o tipo de uma matriz ou o tipo de retorno de uma expressão lambda.
Declaração de Expressões
Um recurso das linguagens baseadas em C é que as atribuições são expressões e não apenas declarações, o que permite atalhos como a = b = c = 0, mas também erros como if (a = false). Por esse motivo, muitos guias de estilo proíbem a modificação de uma variável em outra instrução.
O C# tem tomado outra direção, com a capacidade de definir variáveis em novos lugares, como parâmetros externos e como parte do pattern matching. Com expressões de declaração, é possível declarar variáveis em quase todos os lugares em que seja possível realizar uma atribuição.
Anteriormente seria possível escrever:
char ch;
while ((ch = GetNextChar()) == 'a' || ch == 'b' || ch == 'c')
seria possível abreviá-lo para:
while ((char ch = GetNextChar()) == 'a' || ch == 'b' || ch == 'c')
Aqui está outro exemplo do que é possível fazer:
var sum = (var p = GetPoint(); p.X + p.Y);
Um recurso relacionado é a capacidade de misturar declarações e variáveis na desconstrução. Primeiro proposto para o C# 7.1, esse recurso permitiria várias atribuições quando algumas, mas não todas, variáveis fossem definidas novamente.
(x, var y) = e;
Funções Locais Aprimoradas
Uma das limitações das funções locais é que os atributos não podem ser aplicados nelas (essa é apenas uma limitação do C#, já que no CLR é possível fazer isso). A razão pela qual podemos ter problemas na versão 8 do C# é que atributos como NotNullWhenTrue podem ser necessários para obter a semântica correta para verificações de objetos nulos.
Em outro exemplo, os atributos em funções locais podem ser usados para configurar o roteamento do ASP.NET de maneira mais conveniente.