Comparteix via


in (Modificador genérico) (Referencia de C#)

Para los parámetros de tipo genérico, use la in palabra clave para permitir argumentos de tipo contravariante. Use la in palabra clave en interfaces y delegados genéricos.

La documentación de referencia del lenguaje C# cubre la versión más reciente publicada del lenguaje C#. También contiene documentación inicial sobre las características de las versiones preliminares públicas de la próxima versión del lenguaje.

La documentación identifica cualquier característica introducida por primera vez en las últimas tres versiones del idioma o en las versiones preliminares públicas actuales.

Sugerencia

Para buscar cuándo se introdujo por primera vez una característica en C#, consulte el artículo sobre el historial de versiones del lenguaje C#.

Contravariance permite usar un tipo menos derivado que el tipo especificado por el parámetro genérico. Esta característica permite la conversión implícita de clases que implementan interfaces contravariantes y conversión implícita de tipos delegados. Los tipos de referencia admiten covarianza y contravarianza en parámetros de tipo genérico, pero los tipos de valor no admiten estas características.

Puede declarar un tipo como contravariante en una interfaz genérica o un delegado solo si define el tipo de parámetros de un método y no el tipo de valor devuelto del método. InLos parámetros , refy out deben ser invariables, lo que significa que no son covariante ni contravariante.

Una interfaz que tiene un parámetro de tipo contravariante permite a sus métodos aceptar argumentos de tipos menos derivados que los especificados por el parámetro de tipo de interfaz. Por ejemplo, en la IComparer<T> interfaz, el tipo T es contravariante. Puede asignar un objeto del IComparer<Person> tipo a un objeto del IComparer<Employee> tipo sin usar ningún método de conversión especial si Employee hereda Person.

Puede asignar un delegado contravariante a otro delegado del mismo tipo, pero con un parámetro de tipo genérico menos derivado.

Para obtener más información, vea Covarianza y Contravarianza.

Interfaz genérica contravariante

En el ejemplo siguiente se muestra cómo declarar, extender e implementar una interfaz genérica contravariante. También muestra cómo puede usar la conversión implícita para las clases que implementan esta interfaz.

// Contravariant interface.
interface IContravariant<in A> { }

// Extending contravariant interface.
interface IExtContravariant<in A> : IContravariant<A> { }

// Implementing contravariant interface.
class Sample<A> : IContravariant<A> { }

class Program
{
    static void Test()
    {
        IContravariant<Object> iobj = new Sample<Object>();
        IContravariant<String> istr = new Sample<String>();

        // You can assign iobj to istr because
        // the IContravariant interface is contravariant.
        istr = iobj;
    }
}

Delegado genérico contravariante

En el ejemplo siguiente se muestra cómo declarar, crear instancias e invocar un delegado genérico contravariante. También muestra cómo puede convertir implícitamente un tipo de delegado.

// Contravariant delegate.
public delegate void DContravariant<in A>(A argument);

// Methods that match the delegate signature.
public static void SampleControl(Control control)
{ }
public static void SampleButton(Button button)
{ }

public void Test()
{

    // Instantiating the delegates with the methods.
    DContravariant<Control> dControl = SampleControl;
    DContravariant<Button> dButton = SampleButton;

    // You can assign dControl to dButton
    // because the DContravariant delegate is contravariant.
    dButton = dControl;

    // Invoke the delegate.
    dButton(new Button());
}

Especificación del lenguaje C#

Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es el origen definitivo de la sintaxis y el uso de C#.

Consulte también