Novidades do C# 13: Overload resolution
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>):
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:
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:
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):