using System.IO; using System; using System.Collections.Generic; class Fruit { public void Eat() { Console.WriteLine("You ate fruit!"); } } class Orange : Fruit {} class Program { static void Main() { // создаём объект делегата, который принимает фрукт и возвращает void Action actionWithFruit = fruit => fruit.Eat(); // создаём список из трёх апельсинов List oranges = new List { new Orange(), new Orange(), new Orange() }; // по факту мы должны передать в метод ForEach объект делгата Action, // который принимает апельсин и возвращает void, но благодаря контравариантности // можем передать Action т.е. записываем в переменную типа Action объект типа Action // контравариантность переварачивает порядок наследования // Orange : Fruit => Action : Action // Fruit fruit = new Orange(); // Action action = new Action(fruit => fruit.Eat()); oranges.ForEach(actionWithFruit); } }