C#

4 ago, 2025

Novidades do C# 14: melhorias no suporte a Generics com a expressão nameof

Publicidade

Antes do C# 14 o uso da expressão nameof com estruturas genéricas estava restrito a declarações em que uma construção genérica possuía um tipo informado como argumento. O uso de nameof em expressões que não informassem um tipo como List<> e IEnumerable<> resultaria então em falhas.

É o que demonstra imagem a seguir, com o uso de List<>HashSet<> e IEnumerable<> em conjunto com nameof produzindo erros na própria IDE (Visual Studio 2022):

Clique nesta imagem para visualizar com uma melhor resolução

Ao ativar o uso de recursos em modo Preview para a linguagem C# (no arquivo .csproj de um projeto de testes) podemos superar esta limitação, habilitando assim a funcionalidade que foi chamada de unbound generic support for nameof:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

</Project>

O código de exemplo com esses testes está na listagem seguinte:

using System.Runtime.InteropServices;

Console.WriteLine("***** Testes com C# 14 + .NET 10 | Unbound generic support for nameof *****");
Console.WriteLine($"Versao do .NET em uso: {RuntimeInformation
    .FrameworkDescription} - Ambiente: {Environment.MachineName} - Kernel: {Environment
    .OSVersion.VersionString}");

Console.WriteLine();
Console.WriteLine($"nameof(List<object>) = {nameof(List<object>)}");
Console.WriteLine($"nameof(HashSet<int>) = {nameof(HashSet<int>)}");
Console.WriteLine($"nameof(IEnumerable<string>) = {nameof(IEnumerable<string>)}");

Console.WriteLine();
Console.WriteLine($"nameof(List<>) = {nameof(List<>)}");
Console.WriteLine($"nameof(HashSet<>) = {nameof(HashSet<>)}");
Console.WriteLine($"nameof(IEnumerable<>) = {nameof(IEnumerable<>)}");

Na próxima imagem notamos que não foi mais apontado o erro anteriormente apresentado:

Clique nesta imagem para visualizar com uma melhor resolução

Ao executar esta aplicação teremos como resultado:

Clique nesta imagem para visualizar com uma melhor resolução

O uso de nameof com List<>HashSet<> e IEnumerable<> produziu como resultados as strings ListHashSet e IEnumerable.

A aplicação utilizada para testes neste artigo foi disponibilizada no GitHub:

https://github.com/renatogroffe/dotnet10-csharp14-nameof-generics

Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!