问题是MyObj.classnameis(TMyClass.classname)
为真且TMyClass(MyObj)
有效,但(MyObj as TMyclass).doSomething
会引发转换错误。
我真的不想要那个垃圾任何帮助,不过如果你想把它放在那些超级的评论中。我只是想知道 Obj as Class
和 Class(Obj)
之间的区别是什么。
答案 0 :(得分:32)
as-cast检查实际的对象类型以确保转换有效,如果不是则引发异常。 “硬转换”(TMyClass(MyObj)
样式)不检查,它只是告诉编译器假设转换有效。
如果您遇到ClassNameIs返回true但是as-cast失败的情况,那意味着您在两个不同的单位中有两个不同的类具有相同的名称,并且as-cast正在尝试转换为错误的一个。这也意味着您的强制转换是错误的,这可能会导致内存损坏。
运行完整项目搜索“TMyclass =”以查看多个声明的位置,并重命名其中一个类或使用完整定义(obj作为MyUnit.TMyClass),以便编译器知道您是哪个类试图施展。
答案 1 :(得分:5)
除了梅森的帖子: 您也可以在给您提问的位置调用类似这样的方法,而不是搜索您的代码。
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的字符串.... 我不记得在旧版本的delphi中看到“ClassType.UnitName”,因此该部分可能无法使用它们,但其余部分应该。