使用(Object as TClass)和TClass(Object)之间的区别有什么区别

时间:2010-03-15 19:18:04

标签: delphi casting typecast-operator

问题是MyObj.classnameis(TMyClass.classname)为真且TMyClass(MyObj)有效,但(MyObj as TMyclass).doSomething会引发转换错误。

我真的不想要那个垃圾任何帮助,不过如果你想把它放在那些超级的评论中。我只是想知道 Obj as Class Class(Obj) 之间的区别是什么。

2 个答案:

答案 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”,因此该部分可能无法使用它们,但其余部分应该。