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