Novidades do C# 13: Overload resolution

Renato Groffe
3 min readJan 6, 2025

--

Em um artigo anterior desta série abordei o uso de params collections, uma das novidades que integram o C# 13:

Novidades do C# 13: params collections

Esta funcionalidade permite que o parâmetro params possa ser utilizado com coleções de diversos tipos, além de arrays (algo que pode facilitar bastante a passagem de parâmetros para um método). Isto abre caminho para diversas sobrecargas (overloads) de um mesmo método, com tais implementações estando baseadas na utilização de params.

A classe OverloadResolutionTester traz sobrecargas do método PrintItems que exemplificam esta possibilidade, recebendo para isso parâmetros baseados em string[], ReadOnlySpan<string?> e IEnumerable<string>:

Utilizando essas implementações como indicado na listagem seguinte:

Teremos o resultado apresentado na imagem a seguir. Vale destacar que na terceira chamada a PrintItems os valores foram passados apenas com a separação por vírgulas (sem identificar um tipo específico), com o compilador optando pela alternativa de melhor performance (neste caso foi ReadOnlySpan<string?>, ao invés de string[] ou IEnumerable<string>):

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

Esta nova capacidade relacionada ao uso de params collections foi chamada de overload resolution. Podemos ir além, dando prioridade a uma sobrecarga em relação às outras através do uso do atributo OverloadResolutionPriorityAttribute (namespace System.Runtime.CompilerServices).

É o que demonstra a implementação do tipo OverloadResolutionPriorityTester, em que um valor mais alto especificado em OverloadResolutionPriority corresponde a uma maior prioridade:

Retomando os testes com as variáveis do exemplo anterior, mas agora com a implementação de PrintItems em OverloadResolutionPriorityTester:

Chegaremos então ao resultado indicado na próxima imagem. A primeira (utilizando um array) e a terceira chamadas (com valores separados por vírgulas) foram associadas à sobrecarga baseada em IEnumerable<string>, já que esta implementação conta com uma maior prioridade:

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

O código completo testando as implementações de OverloadResolutionTester e OverloadResolutionPriorityTester está na listagem a seguir:

O resultado da execução desta aplicação de testes está na imagem seguinte:

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

Este projeto foi disponibilizado no GitHub:

https://github.com/renatogroffe/CSharp13-ConsoleApp-OverloadResolution

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!

Em uma live recente no Canal .NET demonstrei também este exemplo com outras variações, como pode acompanhar no vídeo a seguir (clique neste link para acessar o conteúdo no YouTube):

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker

No responses yet