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< Fruit> actionWithFruit = fruit => fruit.Eat ( ) ;
// создаём список из трёх апельсинов
List< Orange> oranges = new List< Orange> { new Orange( ) , new Orange( ) , new Orange( ) } ;
// по факту мы должны передать в метод ForEach объект делгата Action<Orange>,
// который принимает апельсин и возвращает void, но благодаря контравариантности
// можем передать Action<Fruit> т.е. записываем в переменную типа Action<Orange> объект типа Action<Fruit>
// контравариантность переварачивает порядок наследования
// Orange : Fruit => Action<Fruit> : Action<Orange>
// Fruit fruit = new Orange();
// Action<Orange> action = new Action<Fruit>(fruit => fruit.Eat());
oranges.ForEach ( actionWithFruit) ;
}
}
dXNpbmcgU3lzdGVtLklPOwp1c2luZyBTeXN0ZW07CnVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwoKY2xhc3MgRnJ1aXQKewogICAgcHVibGljIHZvaWQgRWF0KCkKICAgIHsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiWW91IGF0ZSBmcnVpdCEiKTsKICAgIH0KfQoKY2xhc3MgT3JhbmdlIDogRnJ1aXQge30KCmNsYXNzIFByb2dyYW0KewogICAgc3RhdGljIHZvaWQgTWFpbigpCiAgICB7CiAgICAgICAgLy8g0YHQvtC30LTQsNGR0Lwg0L7QsdGK0LXQutGCINC00LXQu9C10LPQsNGC0LAsINC60L7RgtC+0YDRi9C5INC/0YDQuNC90LjQvNCw0LXRgiDRhNGA0YPQutGCINC4INCy0L7Qt9Cy0YDQsNGJ0LDQtdGCIHZvaWQKICAgICAgICBBY3Rpb248RnJ1aXQ+IGFjdGlvbldpdGhGcnVpdCA9IGZydWl0ID0+IGZydWl0LkVhdCgpOwoKICAgICAgICAvLyDRgdC+0LfQtNCw0ZHQvCDRgdC/0LjRgdC+0Log0LjQtyDRgtGA0ZHRhSDQsNC/0LXQu9GM0YHQuNC90L7QsgogICAgICAgIExpc3Q8T3JhbmdlPiBvcmFuZ2VzID0gbmV3IExpc3Q8T3JhbmdlPiB7IG5ldyBPcmFuZ2UoKSwgbmV3IE9yYW5nZSgpLCBuZXcgT3JhbmdlKCkgfTsKCiAgICAgICAgLy8g0L/QviDRhNCw0LrRgtGDINC80Ysg0LTQvtC70LbQvdGLINC/0LXRgNC10LTQsNGC0Ywg0LIg0LzQtdGC0L7QtCBGb3JFYWNoINC+0LHRitC10LrRgiDQtNC10LvQs9Cw0YLQsCBBY3Rpb248T3JhbmdlPiwKICAgICAgICAvLyDQutC+0YLQvtGA0YvQuSDQv9GA0LjQvdC40LzQsNC10YIg0LDQv9C10LvRjNGB0LjQvSDQuCDQstC+0LfQstGA0LDRidCw0LXRgiB2b2lkLCDQvdC+INCx0LvQsNCz0L7QtNCw0YDRjyDQutC+0L3RgtGA0LDQstCw0YDQuNCw0L3RgtC90L7RgdGC0LggCiAgICAgICAgLy8g0LzQvtC20LXQvCDQv9C10YDQtdC00LDRgtGMIEFjdGlvbjxGcnVpdD4g0YIu0LUuINC30LDQv9C40YHRi9Cy0LDQtdC8INCyINC/0LXRgNC10LzQtdC90L3Rg9GOINGC0LjQv9CwIEFjdGlvbjxPcmFuZ2U+INC+0LHRitC10LrRgiDRgtC40L/QsCBBY3Rpb248RnJ1aXQ+CiAgICAgICAgLy8g0LrQvtC90YLRgNCw0LLQsNGA0LjQsNC90YLQvdC+0YHRgtGMINC/0LXRgNC10LLQsNGA0LDRh9C40LLQsNC10YIg0L/QvtGA0Y/QtNC+0Log0L3QsNGB0LvQtdC00L7QstCw0L3QuNGPCiAgICAgICAgLy8gT3JhbmdlIDogRnJ1aXQgPT4gQWN0aW9uPEZydWl0PiA6IEFjdGlvbjxPcmFuZ2U+CiAgICAgICAgLy8gRnJ1aXQgZnJ1aXQgPSBuZXcgT3JhbmdlKCk7CiAgICAgICAgLy8gQWN0aW9uPE9yYW5nZT4gYWN0aW9uID0gbmV3IEFjdGlvbjxGcnVpdD4oZnJ1aXQgPT4gZnJ1aXQuRWF0KCkpOwogICAgICAgIG9yYW5nZXMuRm9yRWFjaChhY3Rpb25XaXRoRnJ1aXQpOwogICAgfQp9
compilation info
prog.cs(32,17): error CS1502: The best overloaded method match for `System.Collections.Generic.List<Orange>.ForEach(System.Action<Orange>)' has some invalid arguments
/usr/lib/mono/2.0/mscorlib.dll (Location of the symbol related to previous error)
prog.cs(32,17): error CS1503: Argument `#1' cannot convert `System.Action<Fruit>' expression to type `System.Action<Orange>'
Compilation failed: 2 error(s), 0 warnings
stdout