Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При назначении метода делегату ковариация и контравариантность обеспечивают гибкость сопоставления типа делегата с сигнатурой метода. Ковариация позволяет методу иметь тип возвращаемого значения, который является более производным, чем определенный в делегате. Контравариантность допускает использование метода, параметры которого имеют типы, менее производные, чем типы в делегате.
Пример 1. Ковариация
Описание
В этом примере показано, как делегаты могут использоваться с методами, имеющими типы возвращаемых данных, производные от возвращаемого типа в сигнатуре делегата. Тип данных, возвращаемый DogsHandler
, имеет тип Dogs
, который является производным от типа Mammals
, определенного в делегате.
Код
class Mammals {}
class Dogs : Mammals {}
class Program
{
// Define the delegate.
public delegate Mammals HandlerMethod();
public static Mammals MammalsHandler()
{
return null;
}
public static Dogs DogsHandler()
{
return null;
}
static void Test()
{
HandlerMethod handlerMammals = MammalsHandler;
// Covariance enables this assignment.
HandlerMethod handlerDogs = DogsHandler;
}
}
Пример 2. Контравариантность
Описание
В этом примере показано, как делегаты могут использоваться с методами, имеющими параметры, типы которых являются базовыми типами типа параметра подписи делегата. С помощью контравариантности можно использовать один обработчик событий вместо отдельных обработчиков. В следующем примере используется два делегата:
Делегат KeyEventHandler, определяющий сигнатуру события Button.KeyDown. Его подпись:
public delegate void KeyEventHandler(object sender, KeyEventArgs e)
Делегат MouseEventHandler, определяющий сигнатуру события Button.MouseClick. Его подпись:
public delegate void MouseEventHandler(object sender, MouseEventArgs e)
В примере определяется обработчик событий с параметром EventArgs, который используется для обработки как события Button.KeyDown
, так и события Button.MouseClick
. Это может сделать, так как EventArgs это базовый тип обоих KeyEventArgs и MouseEventArgs.
Код
// Event handler that accepts a parameter of the EventArgs type.
private void MultiHandler(object sender, System.EventArgs e)
{
label1.Text = System.DateTime.Now.ToString();
}
public Form1()
{
InitializeComponent();
// You can use a method that has an EventArgs parameter,
// although the event expects the KeyEventArgs parameter.
this.button1.KeyDown += this.MultiHandler;
// You can use the same method
// for an event that expects the MouseEventArgs parameter.
this.button1.MouseClick += this.MultiHandler;
}