遇到一个问题,该问题MyObj.classnameis(TMyClass.classname)
是真实的并且TMyClass(MyObj)
有效,但(MyObj as TMyclass).doSomething
会引发转换错误。
我真的不希望对那个垃圾有任何帮助,尽管如果你想把它放在评论中,那就太好了。我只是想知道Obj as Class
和之间有什么区别Class(Obj)
。
遇到一个问题,该问题MyObj.classnameis(TMyClass.classname)
是真实的并且TMyClass(MyObj)
有效,但(MyObj as TMyclass).doSomething
会引发转换错误。
我真的不希望对那个垃圾有任何帮助,尽管如果你想把它放在评论中,那就太好了。我只是想知道Obj as Class
和之间有什么区别Class(Obj)
。
as-cast 检查实际的对象类型以确保强制转换有效,如果不是则引发异常。“硬转换”(TMyClass(MyObj)
样式)不会检查,它只是告诉编译器假设转换是有效的。
如果您遇到 ClassNameIs 返回 true 但 as-cast 失败的情况,这意味着您在两个具有相同名称的不同单元中有两个不同的类,并且 as-cast 试图转换为错误的类。这也意味着您的硬演员正在投射到错误的人身上,这可能会导致内存损坏。
运行完整的项目搜索“TMyclass =”以查看您的多个声明在哪里,然后重命名其中一个类或使用完整定义(obj as MyUnit.TMyClass),以便编译器知道您正在尝试转换哪个类到。
对 Mason 的帖子的补充:您也可以在给您带来问题的位置调用类似这样的方法,而不是搜索您的代码。
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;
That will return you a string formated as (UnitName)TObject.TPersistent.TComponent.... I don't remember seeing "ClassType.UnitName" in older version of delphi, so that part might not work with them, but the rest should.