Sobrecarga de operadores de extensión en C# 14

Esta sobrecarga de operador pipe `|` permite personalizar un casteo, una conversión y darle mejor semántica a nuestro código.

Con C# 14 ya es posible definir sobrecargas de operadores mediante extension members, incluso para tipos que no controlamos como string.

Por ejemplo:

CSHARP
quot;{left} | {right}"; } } }" aria-label="Copiar código"> Copiar
public static class StringExtensions
{
    extension(string)
    {
        public static string operator |(string left, string right)
        {
            return $"{left} | {right}";
        }
    }
}

Lo interesante no es el ejemplo en sí, sino las posibilidades que habilita.

Una idea que me resulta interesante es combinar esta característica con un enum para construir una API tipo pipe conversion (o el nombre que termine teniendo).

CSHARP
string md5 = "name" | FormatAs.MD5;
string sha = "name" | FormatAs.Sha256;
string base64 = "name" | FormatAs.Base64;

La implementación sería tan simple como sobrecargar el operador para recibir el enum:

CSHARP
extension(string)
{
    public static string operator |(string value, FormatAs format)
    {
        return format switch
        {
            FormatAs.MD5 => ...,
            FormatAs.Sha256 => ...,
            FormatAs.Base64 => ...,
            _ => throw new ArgumentOutOfRangeException()
        };
    }
}

No digo que este sea el mejor uso para la característica, pero sí me parece un buen ejemplo de cómo los operadores de extensión permiten construir APIs mucho más expresivas sobre tipos existentes, sin necesidad de wrappers ni métodos de extensión encadenados.

#extensions #operators