Share via


in (modificador genérico) (Referência de C#)

Para os parâmetros de tipo genérico, o in palavra-chave especifica que o parâmetro de tipo é contravariant. Você pode usar o in palavra-chave em delegados e interfaces genéricas.

/ Contravariância permite que você use um tipo derivado menos do que o especificado pelo parâmetro genérico. Isso permite a conversão implícita de classes que implementam interfaces variant e conversão implícita de tipos delegate. Há suporte para tipos de referência covariância e/contravariância nos parâmetros de tipo genérico, mas eles não são suportados para tipos de valor.

Um tipo pode ser declarado contravariant em uma interface genérica ou delegado se ele é usado apenas como um tipo de argumentos de método e não é usado como um tipo de retorno do método. Refe out parâmetros não podem ser uma variante.

Uma interface que possui um parâmetro de tipo contravariant permite que os seus métodos aceitar os argumentos de menos tipos derivados além daqueles especificados pelo parâmetro de tipo de interface. Por exemplo, porque no.NET Framework 4, no IComparer interface, tipo t contravariant, você pode atribuir um objeto da IComparer(Of Person) a um objeto do tipo da IComparer(Of Employee) tipo sem usar quaisquer métodos de conversão especial se Employee herda Person.

Um delegado contravariant pode ser atribuído a outro representante do mesmo tipo, mas com um parâmetro de tipo genérico menos derivado.

Para obter mais informações, consulte Covariância e contravariância (C# e Visual Basic).

Exemplo

O exemplo a seguir mostra como declarar, estender e implementar uma interface genérica de contravariant. Ele também mostra como você pode usar a conversão implícita para classes que implementam esta interface.

// 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;
    }
}

O exemplo a seguir mostra como declarar, instanciar e invocar um delegado genérico do contravariant. Ele também mostra como você pode converter implicitamente um tipo delegate.

// 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()); 
}

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Consulte também

Referência

out (modificador genérico) (Referência de C#)

Modificadores (Referência de C#)

Outros recursos

Covariância e contravariância (C# e Visual Basic)