out (modyfikator ogólny) (odwołanie w C#)

W przypadku parametrów typu ogólnego słowo kluczowe określa, out że parametr typu jest kowariantny. Słowo kluczowe można użyć out w interfejsach ogólnych i delegatach.

Kowariancja umożliwia użycie bardziej pochodnego typu niż określony przez parametr ogólny. Umożliwia to niejawną konwersję klas implementujących interfejsy kowariantne i niejawną konwersję typów delegatów. Kowariancja i kontrawariancja są obsługiwane w przypadku typów odwołań, ale nie są obsługiwane dla typów wartości.

Interfejs, który ma kowariantny parametr typu, umożliwia jego metodom zwracanie większej liczby typów pochodnych niż te określone przez parametr typu. Na przykład, ponieważ w programie .NET Framework 4 typ T jest kowariantny, IEnumerable<T>można przypisać obiekt typu do obiektu IEnumerable(Of String)IEnumerable(Of Object) typu bez użycia żadnych specjalnych metod konwersji.

Delegat kowariantny może mieć przypisany inny delegat tego samego typu, ale z bardziej pochodnym parametrem typu ogólnego.

Aby uzyskać więcej informacji, zobacz Covariance i Contravariance.

Przykład — kowariantny interfejs ogólny

W poniższym przykładzie pokazano, jak deklarować, rozszerzać i implementować kowariantny interfejs ogólny. Pokazano również, jak używać niejawnej konwersji dla klas implementujących kowariantny interfejs.

// Covariant interface.
interface ICovariant<out R> { }

// Extending covariant interface.
interface IExtCovariant<out R> : ICovariant<R> { }

// Implementing covariant interface.
class Sample<R> : ICovariant<R> { }

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

        // You can assign istr to iobj because
        // the ICovariant interface is covariant.
        iobj = istr;
    }
}

W interfejsie ogólnym parametr typu można zadeklarować kowariantnie, jeśli spełnia następujące warunki:

Przykład — kowariantny delegat ogólny

W poniższym przykładzie pokazano, jak zadeklarować, utworzyć wystąpienie i wywołać współwariantnego delegata ogólnego. Przedstawiono również sposób niejawnego konwertowania typów delegatów.

// Covariant delegate.
public delegate R DCovariant<out R>();

// Methods that match the delegate signature.
public static Control SampleControl()
{ return new Control(); }

public static Button SampleButton()
{ return new Button(); }

public void Test()
{
    // Instantiate the delegates with the methods.
    DCovariant<Control> dControl = SampleControl;
    DCovariant<Button> dButton = SampleButton;

    // You can assign dButton to dControl
    // because the DCovariant delegate is covariant.
    dControl = dButton;

    // Invoke the delegate.
    dControl();
}

W delegatu ogólnym typ może być zadeklarowany kowariantnie, jeśli jest używany tylko jako typ zwracany przez metodę i nie jest używany dla argumentów metody.

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.

Zobacz też