我正在嘗試通過調用DTO列表中的select來創建DTO列表中的ViewModel。 然而,編譯器給了我一個錯誤說:爲什麼編譯器不能推斷這個select調用的類型?
的方法類型參數不能從使用推斷嘗試指定類型參數
我的問題是,爲什麼不可以呢? 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子句有一個默認情況,即錯誤不應該由不返回值的路徑引起。
好吧,這工作,粘貼「作爲第」既回報落後。爲什麼我需要這樣做呢?不應該因爲我在表達式所在的方法中返回一個節的列表這一事實而導致它們都來自Section的事實嗎? – Glubus
我想這是因爲如果編譯器會檢查整個繼承鏈,這可能會在整個鏈上需要幾個循環。 Assuem你有一個更深的鏈。現在編譯器應該檢查整個鏈中提到的所有接口和基類,這可能需要很長時間。 – HimBromBeere
它們都從'object'繼承。 –