Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un método genérico es un método que se declara con parámetros de tipo, como se indica a continuación:
static void Swap<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
En el ejemplo de código siguiente se muestra una manera de llamar al método mediante int
para el argumento type:
public static void TestSwap()
{
int a = 1;
int b = 2;
Swap<int>(ref a, ref b);
System.Console.WriteLine(a + " " + b);
}
También puede omitir el argumento de tipo y el compilador lo deducirá. La siguiente llamada a es equivalente a Swap
la llamada anterior:
Swap(ref a, ref b);
Las mismas reglas para la inferencia de tipos se aplican a métodos estáticos y métodos de instancia. El compilador puede deducir los parámetros de tipo en función de los argumentos del método que se pasan; no puede deducir los parámetros de tipo solo de una restricción o un valor devuelto. Por lo tanto, la inferencia de tipos no funciona con métodos que no tienen parámetros. La inferencia de tipos se produce en tiempo de compilación antes de que el compilador intente resolver las firmas de método sobrecargadas. El compilador aplica la lógica de inferencia de tipos a todos los métodos genéricos que comparten el mismo nombre. En el paso de resolución de sobrecarga, el compilador solo incluye los métodos genéricos en los que la inferencia de tipos se realizó correctamente.
Dentro de una clase genérica, los métodos no genéricos pueden tener acceso a los parámetros de tipo de nivel de clase, como se indica a continuación:
class SampleClass<T>
{
void Swap(ref T lhs, ref T rhs) { }
}
Si define un método genérico que toma los mismos parámetros de tipo que la clase contenedora, el compilador genera la advertencia CS0693 porque dentro del ámbito del método, el argumento proporcionado para el elemento interno T
oculta el argumento proporcionado para el externo T
. Si necesita la flexibilidad de llamar a un método de clase genérico con argumentos de tipo distintos de los proporcionados cuando se creó una instancia de la clase, considere la posibilidad de proporcionar otro identificador para el parámetro type del método, como se muestra en GenericList2<T>
el ejemplo siguiente.
class GenericList<T>
{
// CS0693.
void SampleMethod<T>() { }
}
class GenericList2<T>
{
// No warning.
void SampleMethod<U>() { }
}
Use restricciones para habilitar operaciones más especializadas en parámetros de tipo en métodos. Esta versión de Swap<T>
, ahora denominada SwapIfGreater<T>
, solo se puede usar con argumentos de tipo que implementan IComparable<T>.
void SwapIfGreater<T>(ref T lhs, ref T rhs) where T : System.IComparable<T>
{
T temp;
if (lhs.CompareTo(rhs) > 0)
{
temp = lhs;
lhs = rhs;
rhs = temp;
}
}
Los métodos genéricos se pueden sobrecargar en varios parámetros de tipo. Por ejemplo, todos los métodos siguientes se pueden ubicar en la misma clase:
void DoWork() { }
void DoWork<T>() { }
void DoWork<T, U>() { }
También puede usar el parámetro type como tipo de valor devuelto de un método. En el ejemplo de código siguiente se muestra un método que devuelve una matriz de tipo T
:
T[] Swap<T>(T a, T b)
{
return [b, a];
}
Especificación del lenguaje C#
Para obtener más información, consulte la Especificación del lenguaje C#.