Ковариантность и контрвариантность делегатов

Последнее обновление: 13.10.2018
Вопрос 1

Что такое ковариантность делегата?

Ковариантность предполагает возможность возвращать из метода объект, тип которого является производным от типа, возвращаемого делегатом.

Вопрос 2

Что такое контвариантность делегата?

Контрвариантность предполагает возможность передавать в метод объект, тип которого является более универсальным по отношению к типу параметра делегата.

Вопрос 3

Дан делегат:

delegate T Factory<out T>();

Этот делегат является ковариантным или контрвариантным?

Данный делегат является ковариантным.

Вопрос 4

Что выведет на консоль следующая программа и почему?

class Person
{
	public string Name { get; set; }
	public virtual void Display() => Console.WriteLine($"Person {Name}");
}
class Client : Person
{
	public override void Display() => Console.WriteLine($"Client {Name}");
}
    
class Program
{
	delegate void DisplayHandler<T>(T item);
	static void Main(string[] args)
	{
		DisplayHandler<Person> personHandler = PersonInfo;
		DisplayHandler<Client> clientHandler = personHandler;

		clientHandler(new Client { Name = "Bob" });
		Console.Read();
	}
	private static void PersonInfo(Person p) => p.Display();
	private static void ClientInfo(Client p) => p.Display();
}

Программа не скомпилируется, потому что мы не можем присвоить переменной делегата DisplayHandler<Client> ссылку на объект DisplayHandler<Person>, так как делегат DisplayHandler не контрвариантный. Чтобы программа работала, нам надо изменить делегат следующим образом:

delegate void DisplayHandler<in T>(T item);
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850