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 użyj słowa kluczowego in , aby zezwolić na argumenty typu contravariant. Użyj słowa kluczowego in w interfejsach ogólnych i delegatach.
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#.
Kontrawariancja umożliwia użycie mniej pochodnego typu niż typ określony przez parametr ogólny. Ta funkcja umożliwia niejawną konwersję klas implementujących interfejsy kontrawariantne i niejawną konwersję typów delegatów. Typy referencyjne obsługują kowariancję i kontrawariancję w parametrach typu ogólnego, ale typy wartości nie obsługują tych funkcji.
Typ można zadeklarować jako kontrawariant w interfejsie ogólnym lub delegować tylko wtedy, gdy definiuje typ parametrów metody, a nie typ zwracany metody.
Inparametry , refi out muszą być niezmienne, co oznacza, że nie są kowariantne ani kontrawariantne.
Interfejs, który ma kontrawariantny parametr typu, umożliwia jego metodom akceptowanie argumentów mniej pochodnych typów niż te określone przez parametr typu interfejsu. Na przykład w interfejsie IComparer<T> typ T jest kontrawariantny. Obiekt typu można przypisać IComparer<Person> do obiektu IComparer<Employee> typu bez użycia żadnych specjalnych metod konwersji, jeśli Employee dziedziczy Personelement .
Możesz przypisać delegata kontrawariantnego do innego delegata tego samego typu, ale z mniej pochodnym parametrem typu ogólnego.
Aby uzyskać więcej informacji, zobacz Covariance i Contravariance.
Interfejs ogólny contravariant
W poniższym przykładzie pokazano, jak deklarować, rozszerzać i implementować kontrawariantny interfejs ogólny. Pokazuje również, jak można użyć niejawnej konwersji dla klas implementujących ten interfejs.
// 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;
}
}
Kontrawariantny delegat ogólny
W poniższym przykładzie pokazano, jak zadeklarować, utworzyć wystąpienie i wywołać kontrawariantnego delegata ogólnego. Pokazuje również, jak można niejawnie przekonwertować typ delegata.
// 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());
}
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
- na zewnątrz
- Kowariancja i kontrawariancja
- modyfikatory