OneOf para C# (.NET): guía completa con ejemplos prácticos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

OneOf para C# (.NET): guía completa con ejemplos prácticos

La librería OneOf es una implementación de uniones discriminadas (discriminated unions) para el lenguaje C#. Resuelve un problema fundamental: cómo representar de forma elegante, en un lenguaje de tipado estático, un valor que puede ser uno de varios tipos conocidos de antemano. En lugar de usar object con conversiones de tipo, Nullable o crear jerarquías de clases, OneOf ofrece una forma tiposegura y expresiva de trabajar con estos valores.

¿Por qué es útil? Primero, mejora la legibilidad del código: la firma de un método que devuelve OneOf<Success, Error> indica de inmediato que la operación puede terminar en éxito o en error. Segundo, elimina toda una clase de errores relacionados con conversiones de tipo incorrectas. Tercero, OneOf obliga al desarrollador a manejar todas las variantes posibles, haciendo que el código sea más robusto y predecible. Esto es especialmente útil en escenarios donde tradicionalmente se usan excepciones (para control de flujo) o se devuelve null.

OneOf encaja perfectamente en el estilo de programación funcional en C#. Permite modelar el dominio de forma más precisa: en lugar de tener una clase Result con banderas y objetos anidados, puedes usar OneOf<T0, T1, T2>, donde cada tipo representa uno de los posibles estados. Esto hace que el código sea más declarativo y reduce la cantidad de construcciones if-else.

Instalación

La instalación de la librería se realiza a través del Administrador de Paquetes NuGet. Ejecuta uno de los siguientes comandos según tu herramienta:

# Package Manager Console
Install-Package OneOf

# .NET CLI
dotnet add package OneOf

# PackageReference (manual en .csproj)
<PackageReference Include="OneOf" Version="3.0.271" />

Después de la instalación, agrega using OneOf; al inicio de tu archivo.

Inicio rápido

Veamos un ejemplo sencillo: una función que divide un número entre otro. En lugar de lanzar una excepción al dividir por cero, devolveremos OneOf<double, string> — ya sea el resultado o un mensaje de error.

using OneOf;

public OneOf<double, string> SafeDivide(double a, double b)
{
    if (b == 0)
        return "Error: división por cero";
    return a / b;
}

// Uso
var result = SafeDivide(10, 2);

result.Switch(
    value => Console.WriteLine($"Resultado: {value}"),
    error => Console.WriteLine($"Error: {error}")
);

// Salida: Resultado: 5

Observa que no usamos parámetros out, no verificamos null ni capturamos excepciones. Todo lo que necesitamos es llamar a Switch o Match y proporcionar los manejadores para cada variante posible.

Métodos y clases principales

La librería ofrece varios mecanismos clave para trabajar con uniones discriminadas. Veamos cada uno en detalle.

1. OneOf<T0, T1, ...>

Firma: public class OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> : IOneOf

Qué hace: Clase base que representa un valor que puede ser uno de los tipos especificados. Soporta hasta 9 tipos. Conversión implícita desde cualquiera de los tipos especificados a OneOf.

OneOf<int, string, bool> value = 42; // conversión implícita
value = "hola";
value = true;

// Creación explícita
var explicitValue = new OneOf<int, string>(100);

2. Switch

Firma: public void Switch(Action<T0> f0, Action<T1> f1, ...)

Qué hace: Ejecuta una de las acciones proporcionadas según el valor almacenado en OneOf. No devuelve nada.

Recommendations