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