Я пытаюсь создать список ViewModels из DTO, вызывая выбор в списке DTO. Однако компилятор дает мне поговорку об ошибке:Почему компилятор не может указать тип этого выбора?
Аргументы типа для метода не может быть выведено из эксплуатации попробуйте указать аргументы типа
мой вопрос, почему не может? Оба TextSectionDTO
и ImageSectionDTO
получены из SectionDTO
. Я пытаюсь создать List
Sections
, и оба TextSection
и ImageSection
получены из Section
.
Я знаю, что этот вопрос близок к некоторым другим вопросам, размещенным здесь, но я не смог найти там ответа.
Это мой код:
private List<Section> BuildSectionViewModel(IEnumerable<SectionDTO> ss)
{
var viewModels = ss.Select((SectionDTO s) =>
{
switch (s.SectionType)
{
case Enums.SectionTypes.OnlyText:
return new TextSection((TextSectionDTO) s);
case Enums.SectionTypes.OnlyImage:
return new ImageSection((ImageSectionDTO) s);
default:
throw new Exception("This section does not exist - FIXME");
}
}).ToList();
return viewModels;
}
Когда я изменить типы, так что я только принимаю суперкласса SectionDTO и возвращать только раздел (я делаю их как обычные классы в этом сценарии), что выберите работает как вы хотите ожидать. Затем, когда я меняю типы только на TextSectionDTO и TextSection (меняя тезисы назад), выбор больше не работает.
Я бы хотел, чтобы это помогло мне работать со строительством, которое у меня есть сейчас, хотя меня больше интересует, почему это не работает так, как есть. Даже если я смогу заставить это работать, я, вероятно, реорганизую это позже.
Примечание:
- Я нацеливание MVC 4.5 (так что компилятор не какая-то старая версия не в состоянии сделать вывод, что было решение некоторых подобных вопросов здесь).
- Предложение switch имеет случай по умолчанию, то есть ошибка не может быть вызвана путем, не возвращающим значение.
Хорошо, это работало, вставили «в разделе» позади оба деклараций. Зачем мне это нужно? Разве не должно быть факта, что они оба выводятся из Секции, достаточно, учитывая тот факт, что я возвращаю список разделов в методе, в котором находится выражение? – Glubus
Я полагаю, это связано с тем, что если компилятор должен проверить всю цепочку наследования, это может занять несколько циклов на всей цепочке. Assuem у вас будет гораздо более глубокая цепь. Теперь компилятор должен проверять все интерфейсы и базовые классы, упомянутые во всей цепочке, которые могут занять слишком много времени. – HimBromBeere
Оба они также наследуются от 'object'. –