where (restricción de tipo genérico) (Guía de programación de C#)

Actualización: noviembre 2007

En una definición de tipo genérico, la cláusula where se utiliza para especificar restricciones sobre los tipos que se pueden utilizar como argumentos para un parámetro de tipo definido en una declaración genérica. Por ejemplo, puede declarar una clase genérica, MyGenericClass, de modo que el parámetro de tipo T implemente la interfaz IComparable<T>:

public class MyGenericClass<T> where T:IComparable { }
Nota:

Para obtener más información sobre la cláusula where en una expresión de consulta, vea where (Cláusula, Referencia de C#).

Además de las restricciones de interfaz, una cláusula where puede incluir una restricción de clase base, que establece que un tipo debe tener la clase especificada como clase base (o ser la propia clase) para poder utilizarlo como argumento de tipo para ese tipo genérico. Si se utiliza una restricción semejante, debe aparecer antes que cualquier otra restricción sobre ese parámetro de tipo.

class MyClass<T, U>
    where T : class
    where U : struct
{}

La cláusula where también puede incluir una restricción de constructor. Es posible crear una instancia de un parámetro de tipo utilizando el operador new; sin embargo, para ello el parámetro de tipo debe estar restringido por la restricción de constructor, new(). La restricción new() permite que el compilador sepa que cualquier argumento de tipo que se proporcione debe tener un constructor sin parámetros accesible, o predeterminado. Por ejemplo:

public class MyGenericClass<T> where T : IComparable, new()
{
    // The following line is not possible without new() constraint:
    T item = new T();
}

La restricción new() aparece en último lugar en la cláusula where.

Con varios parámetros de tipo, utilice una cláusula where para cada parámetro de tipo, por ejemplo:

interface IMyInterface
{
}

class Dictionary<TKey, TVal>
    where TKey : IComparable, IEnumerable
    where TVal : IMyInterface
{
    public void Add(TKey key, TVal val)
    {
    }
}

También puede adjuntar restricciones a parámetros de tipo de métodos genéricos, como el siguiente:

public bool MyMethod<T>(T t) where T : IMyInterface { }

Observe que la sintaxis para describir las restricciones de parámetros de tipo en delegados es igual que la sintaxis de métodos.

delegate T MyDelegate<T>() where T : new()

Para obtener información sobre delegados genéricos, vea Delegados genéricos (Guía de programación de C#).

Para obtener información detallada sobre la sintaxis y el uso de restricciones, vea Restricciones de tipos de parámetros (Guía de programación de C#).

Especificación del lenguaje C#

Para obtener más información, vea las siguientes secciones de Especificación del lenguaje C#:

  • 19.1.4 Restricciones

Vea también

Conceptos

Guía de programación de C#

Referencia

Introducción a los genéricos (Guía de programación de C#)

Restricción new (Referencia de C#)

Restricciones de tipos de parámetros (Guía de programación de C#)

Otros recursos

Referencia de C#