Tôi đang cố gắng tạo danh sách Chế độ xem Biểu mẫu từ một DTO bằng cách gọi một danh sách chọn trong danh sách của DTO. Tuy nhiên, trình biên dịch mang lại cho tôi một câu nói lỗi:Tại sao trình biên dịch không thể suy ra loại cho cuộc gọi chọn này?
Những lập luận kiểu cho phương pháp không thể được suy ra từ việc sử dụng thử xác định các đối số loại
Câu hỏi của tôi là, tại sao không thể nó? Cả hai TextSectionDTO
và ImageSectionDTO
có nguồn gốc từ SectionDTO
. Tôi đang cố gắng tạo một số List
của Sections
và cả hai số TextSection
và ImageSection
có nguồn gốc từ Section
.
Tôi biết câu hỏi này gần với một số câu hỏi khác được đăng trên đây, nhưng tôi không thể tìm thấy câu trả lời ở đó.
Đây là mã của tôi:
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;
}
Khi tôi thay đổi loại vì vậy mà tôi chỉ chấp nhận SectionDTO lớp cha và chỉ trả lại Mục (Tôi làm cho họ cả hai lớp bình thường trong trường hợp này) các tác phẩm chọn như bạn muốn chờ đợi. Sau đó, khi tôi thay đổi các loại chỉ TextSectionDTO và TextSection (thay đổi các tóm tắt trở lại), lựa chọn không hoạt động nữa.
Tôi muốn một giải pháp để tôi có thể làm việc này với công trình mà tôi có ngay bây giờ, mặc dù tôi quan tâm hơn đến lý do tại sao điều này không hoạt động theo cách đó. Ngay cả khi tôi có thể làm điều này để làm việc tôi có lẽ sẽ refactor này sau này.
Lưu ý:
- Tôi đang nhắm mục tiêu MVC 4,5 (do đó trình biên dịch không phải là một phiên bản cũ không có khả năng suy luận, đó là giải pháp cho một số câu hỏi tương tự như trên đây).
- Điều khoản chuyển đổi có trường hợp mặc định, tức là lỗi không được gây ra bởi đường dẫn không trả lại giá trị.
Được rồi, đây làm việc, dán 'như mục' đằng sau cả lợi nhuận. Tại sao tôi cần phải làm điều này mặc dù? Không phải là một thực tế rằng cả hai đều lấy được từ phần là đủ cho thực tế là tôi đang trở về một danh sách các phần trong phương pháp biểu thức là trong? – Glubus
Tôi cho rằng điều này là bởi vì nếu trình biên dịch WOULD kiểm tra toàn bộ chuỗi thừa kế, điều này có thể mất vài vòng trên toàn bộ chuỗi. Như bạn đang có một chuỗi sâu hơn nhiều. Bây giờ trình biên dịch nên kiểm tra tất cả các giao diện và các lớp cơ sở được đề cập trong toàn bộ chuỗi có thể mất quá nhiều thời gian. – HimBromBeere
Cả hai đều được kế thừa từ 'đối tượng'. –