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

Pet*_*ner 17 delphi casting typecast-operator

有一个问题,哪里MyObj.classnameis(TMyClass.classname)是真的,TMyClass(MyObj)但有效,但(MyObj as TMyclass).doSomething会引发转换错误.

我真的不希望任何有关垃圾的帮助,不过如果你想把它放在超级评论中.我只是想知道Obj as Class和之间的区别Class(Obj).

Mas*_*ler 32

as-cast检查实际的对象类型以确保转换有效,如果不是则引发异常."硬强制转换"(TMyClass(MyObj)样式)不检查,它只是告诉编译器假设强制转换是有效的.

如果你遇到ClassNameIs返回true但是as-cast失败的情况,那意味着你有两个不同的类,它们在两个不同的单元中具有相同的名称,并且as-cast试图转换为错误的类.这也意味着您的强制转换是错误的,这可能会导致内存损坏.

运行完整项目搜索"TMyclass ="以查看多个声明的位置,并重命名其中一个类或使用完整定义(obj作为MyUnit.TMyClass),以便编译器知道您要尝试转换哪个类至.


Ken*_*ssa 5

除了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;
Run Code Online (Sandbox Code Playgroud)

这将返回一个格式化为(UnitName)TObject.TPersistent.TComponent的字符串....我不记得在旧版本的delphi中看到"ClassType.UnitName",因此该部分可能无法使用它们,但其余的应该.