我不确定如何解释这一点,所以请让我澄清任何没有意义的事情。我有一个接口和一个模板函数,它返回基于编译时参数返回匿名内部类的函数:
interface MyInterface {
void getName();
}
MyInterface function() getMyInterfaceFactory(string name)() {
return function() {
return new class MyInterface {
void getName() { //Do something involving name here }
};
};
}
现在,getMyInterfaceFactory()
曾经是getMyInterface()
,它曾经直接返回匿名对象。一切正常。当我添加工厂函数时,我在从 Object 启动期间开始收到异常:
object.Exception.....(102): need opCmp for class mymodule.getMyInterfaceFactory!("someargument").getMyInterfaceFactory.__funcliteral14.__anonclass13
所以,我查看了 druntime 源代码中的 throwing 行,它看起来像是 object 的 opCmp 的默认实现只是 throws。我没有MyInterface
在任何地方比较工厂功能或 s。我将工厂存储为字符串索引关联数组的值,但是当我将匿名类直接存储在该数组中时不需要 opCmp,只有当我开始存储函数时才需要。如果我插入一个 opCmp(使用内存地址),一切似乎都正常工作,但 MyInterface 并没有真正的可比性,所以我宁愿不这样做,除非我必须这样做。如果可能的话,我想知道在匿名类上调用 opCmp 的原因/位置,以及如何防止或解决它。
注意:在 Object 中 opCmp 的默认实现包括一个模糊引用错误的注释,一个注释掉的内存地址比较,然后是抛出版本。
谢谢!
编辑:我应该提一下,我尝试了 windbg 和 ddbg 来准确追踪 opCmp 被调用的位置,但在这两种情况下都失败了。Windbg 没有提供任何有用的信息,因为它固执地拒绝加载任何符号,ddbg 加载了符号,但是在初始化期间(在静态模块构造函数之后但在 main 之前)发生了异常,并且可能 ddbg 无法访问运行时符号?