Какая разница между использованием каста (Object as TClass) и TClass (Object)

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

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

Ответы

Ответ 1

Аспирация проверяет фактический тип объекта, чтобы убедиться, что акты действительны и вызывает исключение, если это не так. "Hard cast" (стиль TMyClass(MyObj)) не проверяет, он просто сообщает компилятору, что он действителен.

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

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

Ответ 2

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

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, поэтому часть может не работать с ними, но остальные должны.