Что такое ковариантность делегата?
Ковариантность предполагает возможность возвращать из метода объект, тип которого является производным от типа, возвращаемого делегатом.
Что такое контвариантность делегата?
Контрвариантность предполагает возможность передавать в метод объект, тип которого является более универсальным по отношению к типу параметра делегата.
Дан делегат:
delegate T Factory<out T>();
Этот делегат является ковариантным или контрвариантным?
Данный делегат является ковариантным.
Что выведет на консоль следующая программа и почему?
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);