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

En los parámetros de tipo genérico, la palabra clave in especifica que el parámetro de tipo es contravariante. Puede usar la palabra clave in en delegados e interfaces genéricos.

La contravarianza permite usar un tipo menos derivado que el especificado por el parámetro genérico. Esto permite la conversión implícita de las clases que implementan interfaces variantes y de los tipos delegados. La covarianza y contravarianza en los parámetros de tipo genérico son compatibles con los tipos de referencia, pero no con los tipos de valor.

Un tipo se puede declarar como contravariante en una interfaz o un delegado genérico si solamente se usa solamente como tipo de los argumentos de método y no como tipo devuelto por un método. Los parámetros Ref y out no pueden ser variantes.

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

A un delegado contravariante se le puede asignar 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 (C# y Visual Basic).

Ejemplo

En el ejemplo siguiente se muestra cómo declarar, extender e implementar una interfaz genérica contravariante. También se muestra cómo se puede usar la conversión implícita para las clases que implementan dicha 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;
    }
}

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

// 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, vea la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también

Referencia

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

Modificadores (Referencia de C#)

Otros recursos

Covarianza y contravarianza (C# y Visual Basic)