El método de extensión LINQ .Cast () falla pero el objeto (type) funciona

Para convertir entre algunos objetos LINQ to SQL y DTO, hemos creado operadores de conversión explícitos en los DTO. De esa manera podemos hacer lo siguiente:

DTOType MyDTO = (LinqToSQLType)MyLinq2SQLObj;

Esto funciona bien

Sin embargo, cuando intenta emitir utilizando el método de extensión LINQ .Cast (), genera una excepción de conversión no válida que dice que no puede emitir el tipo Linq2SQLType para escribir DTOType. es decir, lo siguiente no funciona

List<DTO.Name> Names = dbContact.tNames.Cast<DTO.Name>()
                                               .ToList();

Pero lo siguiente funciona bien:

DAL.tName MyDalName = new DAL.tName();
DTO.Name MyDTOName = (DTO.Name)MyDalName;

y el siguiente también funciona bien

List<DTO.Name> Names = dbContact.tNames.Select(name => (DTO.Name)name)
                                               .ToList();

¿Por qué el método de extensión .Cast () produce una excepción de conversión no válida? He usado el método de extensión .Cast () de esta manera muchas veces en el pasado y cuando está convirtiendo algo como un tipo base en un tipo derivado, funciona bien, pero se cae cuando el objeto tiene un operador de conversión explícito.

Respuestas a la pregunta(3)

Su respuesta a la pregunta