Métodos genéricos
Parámetros de tipo en métodos
Métodos genéricos es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
¿Qué son los métodos genéricos?
Un método genérico declara uno o varios parámetros de tipo propios, escritos entre corchetes angulares después del nombre del método. El mismo cuerpo del método funciona entonces con muchos tipos sin conversiones ni duplicación.
Los parámetros de tipo son marcadores de posición como T. El compilador sustituye el tipo real en el punto de llamada y mantiene la comprobación estricta de tipos.
void Print<T>(T value)
{
Console.WriteLine(value);
}Declarar un parámetro de tipo
La lista de parámetros de tipo <T> se sitúa entre el nombre del método y la lista de parámetros. Puede utilizar T como tipo de parámetro, tipo de retorno o tipo de una variable local dentro del cuerpo.
Por convención, los parámetros de tipo únicos se denominan T; también son habituales nombres descriptivos como TKey.
T Echo<T>(T input)
{
return input;
}Llamadas con inferencia de tipos
Normalmente no se especifica explícitamente el argumento de tipo. El compilador infiere T a partir de los argumentos que se pasan.
Aquí, Echo(42) infiere T = int y Echo("hi") infiere T = string. La inferencia de tipos mantiene las llamadas genéricas limpias y fáciles de leer.
using System;
class Program
{
static T Echo<T>(T input) => input;
static void Main()
{
Console.WriteLine(Echo(42));
Console.WriteLine(Echo("hi"));
}
}Argumentos de tipo explícitos
Cuando la inferencia no puede determinar el tipo, o cuando se quiere ser explícito, se proporciona el argumento de tipo entre corchetes angulares en el lugar de la llamada.
Esto es necesario cuando ningún argumento contiene el tipo, por ejemplo, en un método cuyo T aparece únicamente en el tipo de retorno.
T Create<T>() where T : new() => new T();
// call:
var list = Create<int>();Varios parámetros de tipo
Un método genérico puede declarar varios parámetros de tipo separados por comas. Cada uno se infiere o se proporciona de forma independiente.
Un ejemplo clásico es un método de intercambio o un constructor de pares que combina dos tipos distintos.
(TSecond, TFirst) Flip<TFirst, TSecond>(TFirst a, TSecond b)
{
return (b, a);
}Un intercambio genérico
Los métodos genéricos son ideales para utilidades que ignoran el tipo concreto. Un intercambio reordena dos valores de cualquier tipo compatible.
La palabra clave ref permite que el método modifique directamente las variables del código que realiza la llamada.
using System;
class Program
{
static void Swap<T>(ref T a, ref T b)
{
T temp = a;
a = b;
b = temp;
}
static void Main()
{
int x = 1, y = 2;
Swap(ref x, ref y);
Console.WriteLine($"{x} {y}");
}
}Restricciones de los parámetros de tipo de los métodos
Un método genérico puede restringir sus parámetros de tipo con una cláusula where. Las restricciones indican al compilador qué operaciones están permitidas sobre T.
En el ejemplo siguiente, where T : IComparable<T> permite que el cuerpo llame a CompareTo de forma segura.
T Max<T>(T a, T b) where T : IComparable<T>
{
return a.CompareTo(b) >= 0 ? a : b;
}Métodos genéricos en clases no genéricas
Una clase no tiene que ser genérica para contener métodos genéricos. Las clases de utilidades estáticas suelen incluirlos.
Esto permite agrupar los auxiliares de propósito general sin obligar a toda la clase a tener un parámetro de tipo.
static class Util
{
public static T First<T>(T[] items) => items[0];
}Inferencia a partir de matrices
La inferencia de tipos también funciona con argumentos de matrices y colecciones. Al pasar un int[], se infiere T = int automáticamente.
Esto hace que los algoritmos genéricos parezcan características integradas del lenguaje.
using System;
class Program
{
static T First<T>(T[] items) => items[0];
static void Main()
{
int[] nums = { 10, 20, 30 };
Console.WriteLine(First(nums));
}
}¿Por qué no usar simplemente object?
Antes de los genéricos, el código usaba object y conversiones de tipo. Esto elimina la seguridad de tipos y provoca boxing de los tipos por valor, lo que perjudica el rendimiento.
Los métodos genéricos evitan el boxing de los tipos por valor y detectan los errores de tipos en tiempo de compilación en lugar de producir excepciones en tiempo de ejecución.
// Unsafe: needs a cast and can fail at runtime
object Echo(object o) => o;
int n = (int)Echo(5);Devolver tipos diferentes
El tipo de retorno también puede ser genérico, lo que permite que un método adapte su resultado al código que lo llama. default(T) produce el valor cero para los tipos por valor o null para los tipos por referencia.
Esto resulta práctico para proporcionar valores alternativos seguros cuando no hay ningún valor disponible.
T OrDefault<T>(bool ok, T value)
{
return ok ? value : default(T);
}Comprobación rápida
Compruebe su comprensión de los métodos genéricos.
Resumen
Los métodos genéricos declaran sus propios parámetros de tipo entre corchetes angulares después del nombre. Normalmente, el compilador infiere el tipo a partir de los argumentos, aunque también se puede proporcionar explícitamente.
Conservan la seguridad de tipos, evitan el boxing y pueden incluir restricciones where. Se pueden colocar en cualquier clase, sea genérica o no.
Preguntas frecuentes
¿La lección «Métodos genéricos» es gratis?
Sí — el texto completo de «Métodos genéricos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Métodos genéricos»?
Parámetros de tipo en métodos Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «Métodos genéricos»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Métodos genéricos
- Clases genéricas
- Restricciones where
- Interfaces genéricas