18

遇到一个问题,该问题MyObj.classnameis(TMyClass.classname)是真实的并且TMyClass(MyObj)有效,但(MyObj as TMyclass).doSomething会引发转换错误。

我真的不希望对那个垃圾有任何帮助,尽管如果你想把它放在评论中,那就太好了。我只是想知道Obj as Class和之间有什么区别Class(Obj)

4

2 回答 2

33

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

如果您遇到 ClassNameIs 返回 true 但 as-cast 失败的情况,这意味着您在两个具有相同名称的不同单元中有两个不同的类,并且 as-cast 试图转换为错误的类。这也意味着您的硬演员正在投射到错误的人身上,这可能会导致内存损坏。

运行完整的项目搜索“TMyclass =”以查看您的多个声明在哪里,然后重命名其中一个类或使用完整定义(obj as MyUnit.TMyClass),以便编译器知道您正在尝试转换哪个类到。

于 2010-03-15T19:24:48.000 回答
6

对 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.

于 2010-03-16T12:57:35.760 回答