В чем разница между приведением типов (Object as TClass) и TClass (Object) - PullRequest
17 голосов
/ 15 марта 2010

Возникла проблема, когда MyObj.classnameis(TMyClass.classname) имеет значение true и TMyClass(MyObj) работает, но (MyObj as TMyclass).doSomething выдает ошибку преобразования.

Я действительно не хочу никакой помощи с этим барахлом, хотя, если вы хотите поместить это в комментарии, это было бы супер. Я просто хотел бы знать, в чем разница между Obj as Class и Class(Obj).

Ответы [ 2 ]

32 голосов
/ 15 марта 2010

as-cast проверяет фактический тип объекта, чтобы убедиться, что приведение является действительным, и вызывает исключение, если это не так. «Жесткое приведение» (стиль TMyClass(MyObj)) не проверяет, оно просто указывает компилятору принять допустимое приведение.

Если у вас возникла ситуация, когда ClassNameIs возвращает true, но as-cast завершается неудачно, это означает, что у вас есть два разных класса в двух разных юнитах с одинаковым именем, и as-cast пытается привести к неправильному. , Это также означает, что ваш жесткий тип приведен к неправильному, что может привести к повреждению памяти.

Запустите полный поиск проекта для «TMyclass =», чтобы увидеть, где находятся ваши несколько объявлений, и либо переименуйте один из классов, либо используйте полное определение (obj как MyUnit.TMyClass), чтобы компилятор знал, какой класс вы используете. пытаясь привести к.

5 голосов
/ 16 марта 2010

Дополнение к посту Мейсона: Вместо поиска по вашему коду, вы также можете вызвать такой метод в том месте, где возникает проблема.

function GetClassInheritance(Obj : TObject) : string;
var ClassRef : TClass;
begin
  Result := '';
  ClassRef := obj.ClassType;
  Result := ClassRef.ClassName;
  ClassRef := ClassRef.ClassParent;
  while assigned(ClassRef) do
  begin
    Result    := ClassRef.ClassName + '.' + Result;
    ClassRef  := ClassRef.ClassParent;
  end;

  Result := '(' + obj.ClassType.UnitName + ')' + Result
end;

Это вернет вам строку, отформатированную как (UnitName) TObject.TPersistent.TComponent .... Я не помню, чтобы видел "ClassType.UnitName" в более старой версии Delphi, так что часть может не работать с ними, но остальные должны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...