Проблема преобразования типов в generic методах
Есть следующий пример (переписан для упрощения понимания):
public class Programm
{
public static void Main(string[] args)
{
var warehouse = new Warehouse_var1<int>();
warehouse.AddBoxFruit<Apple>(new AppleBox());
}
}
public class Warehouse_var1<TAmount>
{
private List<BoxFruit<Fruit<TAmount>>> list = new List<BoxFruit<Fruit<TAmount>>>();
public void AddBoxFruit<TFruit>(BoxFruit<TFruit> boxFruit)
where TFruit : Fruit<TAmount>
{
MyGenericMethod<TFruit>();
list.Add(boxFruit);
}
private void MyGenericMethod<TFruit>()
{
Console.WriteLine("Generic Method!");
}
}
//Модель фрукта, количество которого измеряется в TAmount
public class Fruit<TAmount> { }
//Реализация фрукта - Яблоко
public class Apple : Fruit<int> { }
//Реализация фрукта - Груша
public class Pear : Fruit<long> { }
//Имеется коробка, для хранения фруктов
public class BoxFruit<TFruit> { }
//Коробка с яблоками
public class AppleBox : BoxFruit<Apple> { }
//Коробка с грушами
public class PearBox : BoxFruit<Pear> { }
- Имеются фрукты, для которых можно указать, в чем измеряется их количество TAmount.
- Есть коробки, которые хранят определенные фрукты TFruit.
- И есть главный класс Warehouse, который хранит коробки с фруктами, но только с определенным типом измерения их количества TAmount.
Склад(Warehouse) должен уметь добавлять к себе коробки с фруктами только с конкретным указанным TAmount у Фрукта. Для этого реализован метод AddBoxFruit. Он является generic, т.к. в нем используется MyGenericMethod, который на основании переданного типа, будет совершать какие-либо действия, от данного метода отказаться нельзя, он необходим для правильной работы программы. После его выполнения - элемент добавляется в список.
Компилятор выкидывает следующие ошибку:

Почему так происходит, если у метода установлено ограничение
where TFruit : Fruit<TAmount> т.е. точно такое же, как и в списке ?
Каким-то образом нужно сделать так, чтобы можно было добавлять в коллекцию любые коробки с фруктами, при этом, чтобы обязательно срабатывал GenericMethod на основании типа переданного фрукта.