Тогда вы хотите это:
void PrintFruitsAndEaters<T, S>(
FruitCollection<T> fruits,
FruitEaterCollection<S> eaters)
where T : Fruit
where S : FruitEater
{
// ...
}
Это ограничит типы T
и S
, как вам требуется;вызов метода с FruitCollection<T>
, где нельзя гарантировать, что T
будет Fruit
или подтипом, приведет к ошибке во время компиляции.То же самое с S
и FruitEater
.
Из-за ограничения при работе со значением типа T
вы сможете получить доступ к членам класса Fruit
, а также при работе сзначение типа S
вы сможете получить доступ к членам класса FruitEater
.
Обратите внимание, что в соответствии с (удаленным) ответом Брайана вы можете добавить ограничения и к типам коллекций:
class FruitCollection<T> : List<T> where T : Fruit { }
class FruitEaterCollection<T> : List<T> where T : FruitEater { }
Но это все равно не позволит вам опустить ограничения метода.
(Кроме того, наследование List<T>
- это зло, вместо этогоиспользуйте IList<T>
)