Приведение списка классов к списку T

72
31 марта 2022, 00:10

Появилась проблема. Есть у меня класс First. Я пытаюсь написать метод на шаблоне T и при попытке вернуть List у меня выходит ошибка:

'IEnumerable' does not contain a definition for 'ToList' and the best extension method overload 'Enumerable.ToList(IEnumerable)' requires a receiver of type 'IEnumerable'

Не могу понять почему такое происходит. Ведь у Enumerable есть toList Почему я не могу выбрать какой тип я хочу подать на выход? Или тут без явного приведения типов не обойтись?

Вот пример моего кода:

class Program
{
    List<First> fl = new List<First>();
    static void Main(string[] args)
    {
    }
    public List<T> GetF<T>() where T : First
    {
        return fl.Where(a => a is T).ToList<T>();
    }
}
public class First
{
    public int Age { get; set; }
}
Answer 1

Смотрите, у вас T : First, т. е. T является First, т. е. в общем случае там может быть любой наследник First. Чуете к чему клоню? Если T : First, то в общем случае обратное неверно: First не является T. Поэтому компилятор не может сделать то что вы хотите. Вам нужно явно повысить тип:

return fl.Where(a => a is T).Select(a => (T)a).ToList<T>();

, либо, что тоже самое, только короче:

return fl.OfType<T>().ToList<T>();
READ ALSO
Что выбрать: nUnit vs xUnit?

Что выбрать: nUnit vs xUnit?

В чём разница между nUnit и xUnitnet?

163
&quot;Бесполезные&quot; функции

"Бесполезные" функции

Недавно, исследовав библиотеку Math, нашёл такие функции - DivRem(), IEEERemainder()Прочитав описание понял что функция DivRem() возвращает результат от деления,...

104
От чего защищаемся когда id не id

От чего защищаемся когда id не id

Сижу читаю статью с хабра, постепенно перенося код из презентации в тестовое приложение

80
Как правильно сделать One to one or zero в fluent api?

Как правильно сделать One to one or zero в fluent api?

Есть 2 объекта которые должны друг от друга зависеть, но один из них может отсутствовать при заполнении пишет:

77