Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Para parâmetros de tipo genérico, use a in palavra-chave para permitir argumentos de tipo contravariantes. Use a in palavra-chave em interfaces genéricas e delegados.
A linguagem C# faz referência a documentos da versão mais recentemente lançada da linguagem C#. Ele também contém a documentação inicial para funcionalidades em pré-visualizações públicas para o próximo lançamento do idioma.
A documentação identifica qualquer recurso introduzido pela primeira vez nas três últimas versões do idioma ou nas versões prévias públicas atuais.
Dica
Para descobrir quando um recurso foi introduzido pela primeira vez em C#, consulte o artigo sobre o histórico de versão da linguagem C#.
A contravariância permite que você use um tipo menos derivado do que o tipo especificado pelo parâmetro genérico. Esse recurso permite a conversão implícita de classes que implementam interfaces contravariantes e conversão implícita de tipos delegados. Os tipos de referência dão suporte a covariância e contravariância em parâmetros de tipo genérico, mas os tipos de valor não dão suporte a esses recursos.
Você pode declarar um tipo como contravariante em uma interface genérica ou delegado somente se ele definir o tipo de parâmetros de um método e não o tipo de retorno do método.
In, refe out os parâmetros devem ser invariáveis, o que significa que não são covariantes nem contravariantes.
Uma interface que tem um parâmetro de tipo contravariante permite que seus métodos aceitem argumentos de tipos menos derivados do que os especificados pelo parâmetro de tipo de interface. Por exemplo, na interface, o IComparer<T> tipo T é contravariante. Você pode atribuir um objeto do IComparer<Person> tipo a um objeto do IComparer<Employee> tipo sem usar métodos de conversão especiais se Employee herdado Person.
Você pode atribuir um delegado contravariante a outro delegado do mesmo tipo, mas com um parâmetro de tipo genérico menos derivado.
Para obter mais informações, consulte Covariance e Contravariance.
Interface genérica contravariante
O exemplo a seguir mostra como declarar, estender e implementar uma interface genérica contravariante. Ele também mostra como você pode usar a conversão implícita para classes que implementam essa 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;
}
}
Delegado genérico contravariante
O exemplo a seguir mostra como declarar, instanciar e invocar um delegado genérico contravariante. Ele também mostra como você pode converter implicitamente um 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());
}
Especificação da linguagem C#
Para obter mais informações, consulte a Especificação da Linguagem C# . A especificação de idioma é a fonte definitiva para a sintaxe e o uso de C#.