Sto provando a creare un elenco di ViewModels da un DTO chiamando una selezione nell'elenco di DTO. Tuttavia, il compilatore mi dà un detto errore:Perché il compilatore non può inferire il tipo per questa chiamata selezionata?
Gli argomenti di tipo per metodo non può essere dedotta dal l'utilizzo provare a specificare gli argomenti di tipo
La mia domanda è, perché non è vero? Entrambi TextSectionDTO
e ImageSectionDTO
derivano da SectionDTO
. Sto cercando di creare un List
di Sections
e entrambi TextSection
e ImageSection
derivano da Section
.
So che questa domanda è vicina ad alcune altre domande pubblicate qui, ma non sono riuscito a trovare una risposta.
Questo è il mio codice:
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;
}
Quando cambio i tipi in modo che accetto solo SectionDTO superclasse e restituire solo la sezione (li faccio entrambe le classi normali in questo scenario) le opere selezionate come ci si aspettarsi. Quindi quando cambio i tipi solo in TextSectionDTO e TextSection (cambiando gli abstract indietro), la selezione non funziona più.
Mi piacerebbe una soluzione in modo che io possa farlo funzionare con la costruzione che ho adesso, anche se sono più interessato al motivo per cui questo non funziona così com'è. Anche se riuscirò a farlo funzionare, probabilmente lo rifatterò più tardi.
Nota:
- ho scelto come target MVC 4.5 (in modo che il compilatore non è una vecchia versione non essere in grado di dedurre, che era la soluzione ad alcune domande simili qui).
- La clausola switch ha un caso predefinito, ovvero l'errore non dovrebbe essere causato da un percorso che non restituisce un valore.
Va bene, questo ha funzionato, incollato 'come sezione' dietro entrambi i rendimenti. Perché devo fare questo però? Non dovrebbe essere sufficiente il fatto che entrambi derivino dalla Sezione dato il fatto che sto restituendo una lista di sezioni nel metodo in cui si trova l'espressione? – Glubus
Suppongo che ciò sia dovuto al fatto che se il compilatore verifica l'intera catena di ereditarietà, questo potrebbe richiedere diversi loop sull'intera catena. Assuem hai una catena molto più profonda. Ora il compilatore dovrebbe verificare tutte le interfacce e le classi di base menzionate nell'intera catena, il che potrebbe richiedere troppo tempo. – HimBromBeere
Entrambi ereditano anche da 'object'. –