C#Intermedio8 oct 2025

¡Sobrecarga Confusa! El retorno inesperado de los 'params'

snippet.c#
using System;

public class Example
{
    public static string Foo(params string[] args)
    {
        Console.WriteLine("Params called");
        return "A";
    }

    public static string Foo(string a, string b)
    {
        Console.WriteLine("Specific called");
        return "B";
    }

    public static void Main(string[] args)
    {
        string result = Foo("one", "two");
        Console.WriteLine(result);
    }
}

¿Qué crees que imprime?

Salida Esperada

Specific called
B

⚠️ Salida Real

Specific called
B

¿Por qué pasa esto?

En C#, la **resolución de sobrecarga** puede ser más astuta que un zorro con un sombrero de copa. Tenemos dos métodos `Foo`: uno que acepta un array `params` de strings y otro que acepta dos strings explícitamente. Al llamar `Foo("one", "two")`, uno podría esperar que el compilador prefiera la versión `params`. ¡Pero no! C# favorece la sobrecarga **más específica**. - El compilador evalúa qué sobrecarga coincide **mejor** con los argumentos proporcionados. - En este caso, la versión con dos parámetros `string` es una coincidencia **exacta**, mientras que la versión `params` requiere la creación de un *nuevo array*. ¡Un pequeño coste extra! Por lo tanto, se elige la sobrecarga más específica, imprimiendo `"Specific called"` y retornando `"B"`. ¡La especificidad siempre gana! 🏆

Conceptos relacionados

overloadingparamscsharp