Один из подходов - добавить ограничение типа на T
, но это не идеально:
public T FooBar<T>(Func<T> function) where T : IEnumerable
{
// T is not strongly typed for the enumerated item
Если вы немного изменили свой метод (w.r.t. T
):
public IEnumerable<T> FooBar<T>(Func<IEnumerable<T>> function)
Затем вы строго печатаете на фактическом перечисляемом элементе с дополнительным бонусом принятия перечисляемых объектов.
Итак, после второго прочтения вашего вопроса я заметил, что существует некоторая путаница в том, что означает T
для вашей переменной returnData
. В случае, когда передается FooBar()
, List<Car>
, T
равен List<Car>
и действительно не имеет связи с общей спецификацией типа самой List<>
. Вы можете думать об этом как о некотором List<U>
, где U
- некоторый другой, неизвестный тип.
Во время выполнения у вас не будет простого способа добраться до U
, поскольку он, так сказать, скрыт внутри T
. Вы можете использовать перегрузку, как рекомендуют некоторые другие ответчики, и предоставить метод, отличный от IEnumerable<U>
, и метод, который принимает аргументы типа Func<IEnumerable<T>>
.
Возможно, с некоторыми подробностями о цели FooBar<T>
, мы могли бы дать более конкретные рекомендации.