A FruitDelegate - делегат, который принимает любые фрукты. Например, допустимо следующее:
FruitDelegate<Fruit> f = new FruitDelegate<Fruit>(EatFruit);
f(new Apple());
f(new Banana());
Вы можете сделать параметр типа T из FruitDelegate контравариантным :
public delegate void FruitDelegate<in T>(T o) where T : Fruit;
, который позволяет назначить FruitDelegate экземпляр переменной FruitDelegate :
FruitDelegate<Apple> f = new FruitDelegate<Fruit>(EatFruit);
f(new Apple());
Это действительно, потому что делегат относится к методу, который (среди других фруктов) принимает яблоки.
Однако нельзя присвоить FruitDelegate экземпляр переменной FruitDelegate :
FruitDelegate<Fruit> f = new FruitDelegate<Apple>(EatApple); // invalid
f(new Apple());
f(new Banana());
Это недопустимо, потому что делегат должен принимать любые фрукты, но будет ссылаться на метод, который не принимает никаких фруктов, кроме яблок.
Вывод: вы не можете добавить FruitDelegate экземпляр к Списку > , поскольку FruitDelegate не является a FruitDelegate .