С# generic "where constraint" с определением "любого общего типа"?

Позвольте мне привести пример:

  • У меня есть общее определение класса/интерфейса:

    interface IGenericCar< T > {...}

  • У меня есть другой класс/интерфейс, который я хочу связать с вышеприведенным классом, например:

    interface IGarrage< TCar > : where TCar: IGenericCar< (**any type here**) > {...}

В принципе, я хочу, чтобы мой общий IGarrage зависел от IGenericCar, независимо от того, был ли он IGenericCar<int> или IGenericCar<System.Color>, потому что у меня нет зависимости от этого типа.

Ответ 1

Как правило, есть 2 способа добиться этого.

Вариант 1. Добавьте в IGarrage еще один параметр, представляющий T который следует передать в IGenericCar<T>:

interface IGarrage<TCar,TOther> where TCar : IGenericCar<TOther> { ... }

Вариант 2. Определите базовый интерфейс для IGenericCar<T> который не является универсальным и ограничен этим интерфейсом.

interface IGenericCar { ... }
interface IGenericCar<T> : IGenericCar { ... }
interface IGarrage<TCar> where TCar : IGenericCar { ... }

Ответ 2

Будет ли смысл делать что-то вроде:

interface IGenericCar< T > {...}
interface IGarrage< TCar, TCarType > 
    where TCar: IGenericCar< TCarType > {...}