Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W przypadku parametrów typu ogólnego słowo kluczowe określa, out że parametr typu jest kowariantny. Użyj słowa kluczowego out w interfejsach ogólnych i delegatach.
Kowariancja umożliwia użycie bardziej pochodnego typu niż określa parametr ogólny. Ta funkcja umożliwia niejawną konwersję klas implementujących interfejsy kowariantne i niejawną konwersję typów delegatów. Kowariancja i kontrawariancja obsługują typy odwołań, ale nie obsługują typów wartości.
Interfejs z kowariantnym parametrem typu umożliwia jego metodom zwracanie większej liczby typów pochodnych niż te określone przez parametr typu. Na przykład, ponieważ na platformie .NET typ IEnumerable<T>T jest kowariantny, można przypisać obiekt typu do obiektu IEnumerable<string>IEnumerable<object> typu bez użycia żadnych specjalnych metod konwersji.
Można przypisać współwariantnego delegata do innego delegata tego samego typu, ale z bardziej pochodnym parametrem typu ogólnego.
Aby uzyskać więcej informacji, zobacz Covariance i Contravariance.
Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację dla funkcjonalności w publicznych wersjach testowych nadchodzącego wydania języka.
Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.
Wskazówka
Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.
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 zadeklaruj kowariantę parametru typu, jeśli spełnia następujące warunki:
Parametr typu jest używany tylko jako zwracany typ metod interfejsu i nie należy go używać jako typu argumentów metody.
Uwaga / Notatka
Istnieje jeden wyjątek od tej reguły. Jeśli kowariantny interfejs ma kontrawariantnego delegata ogólnego jako parametr metody, można użyć kowariantnego typu jako parametru typu ogólnego dla tego delegata. Aby uzyskać więcej informacji na temat kowariantnych i kontrawariantnych delegatów ogólnych, zobacz Variance in Delegates (Odchylenie w delegatach ) i Using Variance for Func and Action Generic Delegates (Odchylenie w delegatach) i Using Variance for Func and Action Generic Delegates (Wariancja w delegatach ogólnych).
Nie używasz parametru typu jako ograniczenia ogólnego dla metod interfejsu.
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 zadeklaruj kowariantny typ, jeśli używasz go tylko jako typu zwracanego metody, a nie 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 także
- Wariancja w interfejsach ogólnych
- w
- modyfikatory