LINQ.Cast () дополнительные сбои метода, но (тип) возражают работам

Для преобразования между некоторым LINQ в объекты SQL и DTOs, мы создали явные операторы броска на DTOs. Тем путем мы можем сделать следующее:

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 () дополнительный метод таким образом много раз в прошлом и когда Вы бросаете что-то как базовый тип к производному типу, это хорошо работает, но падает, когда объект имеет явный оператор броска.

18
задан Ben Robinson 12 May 2010 в 13:59
поделиться

1 ответ

Метод расширения Cast <> не применяет пользовательские преобразования. Он может приводить только к интерфейсам или внутри иерархии классов предоставленного типа.

Пользовательские преобразования идентифицируются во время компиляции на основе статических типов, задействованных в выражении. Они не могут применяться как преобразования во время выполнения, поэтому следующее недопустимо:

public class SomeType
{
  public static implicit operator OtherType(SomeType s) 
  { 
    return new OtherType(); 
  }
}

public class OtherType { }

object x = new SomeType();
OtherType y = (OtherType)x; // will fail at runtime

Не имеет значения, существует ли UDC от SomeType до OtherType - он не может быть применен через ссылку типа объект . Попытка запустить приведенный выше код завершится ошибкой во время выполнения, сообщая что-то вроде:

System.InvalidCastException: 
    Unable to cast object of type 'SomeType' to type 'OtherType'

Cast <> () может выполнять только преобразования с сохранением представления ... поэтому вы не можете использовать его для применения пользовательских преобразований.

Эрик Липперт написал отличную статью о поведении оператора приведения в C # - ее всегда стоит прочитать.

25
ответ дан 30 November 2019 в 08:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: