Sdílet prostřednictvím


in (generický modifikátor) (Referenční dokumentace jazyka C#)

U parametrů obecného typu určuje klíčové slovo, in že parametr typu je kontravariantní. Klíčové slovo můžete použít in v obecných rozhraních a delegátech.

Kontravariance umožňuje použít méně odvozený typ, než který specifikuje obecný parametr. To umožňuje implicitní převod tříd, které implementují kontravariantní rozhraní a implicitní převod typů delegátů. Kovariance a kontravariance v parametrech obecného typu jsou podporovány pro referenční typy, ale nejsou podporovány pro typy hodnot.

Typ lze deklarovat kontravariant v obecném rozhraní nebo delegát pouze v případě, že definuje typ parametrů metody, a ne návratového typu metody. In, refa out parametry musí být invariantní, což znamená, že nejsou kovariantní ani kontravariantní.

Rozhraní s parametrem kontravariantního typu umožňuje jeho metodám přijímat argumenty nižších odvozených typů, než které určuje parametr typu rozhraní. Například v IComparer<T> rozhraní typ T je kontravariantní, můžete přiřadit objekt IComparer<Person> typu k objektu IComparer<Employee> typu bez použití speciálních metod převodu, pokud Employee dědí Person.

Kontravariantní delegát může být přiřazen jiný delegát stejného typu, ale s méně odvozeným parametrem obecného typu.

Další informace naleznete v tématu Kovariance a Kontravariance.

Kontravariantní obecné rozhraní

Následující příklad ukazuje, jak deklarovat, rozšířit a implementovat kontravariantní obecné rozhraní. Také ukazuje, jak můžete použít implicitní převod pro třídy, které implementují toto rozhraní.

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

Kontravariantní obecný delegát

Následující příklad ukazuje, jak deklarovat, vytvořit instanci a vyvolat kontravariantní obecný delegát. Ukazuje také, jak můžete implicitně převést typ delegáta.

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

specifikace jazyka C#

Další informace najdete v tématu Specifikace jazyka C#. Specifikace jazyka je úplným a rozhodujícím zdrojem pro syntaxi a použití jazyka C#.

Viz také