Próbuję utworzyć listę ViewModels z DTO, dzwoniąc do wyboru na liście DTO. Jednak kompilator daje mi powiedzenie o błędzie:Dlaczego kompilator nie może wywnioskować typu dla tego połączenia wybierającego?
Argumenty typu dla metody nie można wywieść z wykorzystaniem spróbować określając argumenty typu
Moje pytanie brzmi, dlaczego nie może? Zarówno TextSectionDTO
, jak i ImageSectionDTO
pochodzą z SectionDTO
. Próbuję utworzyć List
z Sections
, a zarówno TextSection
i ImageSection
pochodzą z Section
.
Wiem, że to pytanie jest podobne do innych pytań opublikowanych tutaj, ale nie byłem w stanie znaleźć tam odpowiedzi.
To jest mój kod:
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;
}
Kiedy zmienić typy tak, że tylko zaakceptować nadrzędnej SectionDTO i tylko powrócić odcinek (robię im zarówno normalne zajęcia w tym scenariuszu) select działa jak wy mieliście oczekiwać. Wtedy, gdy zmienię typy tylko na TextSectionDTO i TextSection (zmieniając abstrakty), wybór już nie działa.
Chciałbym znaleźć rozwiązanie, dzięki któremu będę mógł pracować z konstrukcją, którą mam teraz, chociaż bardziej interesuje mnie, dlaczego to nie działa tak, jak jest. Nawet jeśli uda mi się to osiągnąć, prawdopodobnie później to zmienię.
Uwaga:
- jestem kierowania MVC 4.5 (więc kompilator nie jest jakaś stara wersja nie jest w stanie wywnioskować, co było rozwiązaniem niektórych podobnych pytań na tutaj).
- Klauzula przełączania ma domyślny przypadek, tj. Błąd nie powinien być spowodowany przez ścieżkę, która nie zwraca wartości.
Dobra, to działało, wklejone „w sekcji” za obu zwrotów. Dlaczego jednak muszę to zrobić? Czy nie powinien być wystarczający fakt, że obydwoje wywodzą się z sekcji, biorąc pod uwagę fakt, że zwracam listę sekcji w metodzie, w której znajduje się wyrażenie? – Glubus
Przypuszczam, że dzieje się tak dlatego, że gdyby kompilator sprawdził cały łańcuch dziedziczenia, może to zająć kilka pętli na całym łańcuchu. Assuem miałbyś dużo głębszy łańcuch. Teraz kompilator powinien sprawdzić wszystkie interfejsy i klasy bazowe wspomniane w całym łańcuchu, które mogą zająć zbyt dużo czasu. – HimBromBeere
Obaj dziedziczą również z 'obiektu'. –