Для преобразования между некоторыми объектами LINQ to SQL и DTO мы создали явные операторы литья на DTO. Таким образом мы можем сделать следующее:
DTOType MyDTO = (LinqToSQLType)MyLinq2SQLObj;
Это хорошо работает.
Однако, когда вы пытаетесь использовать метод LINQ.Cast(), он запускает недопустимое исключение литья, говорящее, что не может использовать тип Linq2SQLType для ввода типа DTOType. то есть нижеследующее не работает.
List<DTO.Name> Names = dbContact.tNames.Cast<DTO.Name>()
.ToList();
Но нижеследующее прекрасно работает:
DAL.tName MyDalName = new DAL.tName();
DTO.Name MyDTOName = (DTO.Name)MyDalName;
и ниже также отлично работает
List<DTO.Name> Names = dbContact.tNames.Select(name => (DTO.Name)name)
.ToList();
Почему метод расширения .Cast() вызывает недопустимое исключение литых? Я использовал метод расширения .Cast() таким образом много раз в прошлом, и когда вы бросаете что-то вроде базового типа в производный тип, он отлично работает, но падает, когда у объекта есть явный оператор литья.