これをどう説明したらいいのかよくわからないので、意味をなさないものを明確にするようにお願いします。コンパイル時の引数に基づいて匿名の内部クラスを返す関数を返すインターフェイスとテンプレート関数があります。
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.Exception.....(102): need opCmp for class mymodule.getMyInterfaceFactory!("someargument").getMyInterfaceFactory.__funcliteral14.__anonclass13
そこで、druntime ソースの throwing 行を調べたところ、Object の opCmp のデフォルト実装が単に throw しているように見えます。私はファクトリ関数やMyInterface
s をどこでも比較していません。ファクトリを文字列インデックス連想配列の値として格納していますが、匿名クラスをその配列に直接格納していたときは opCmp は必要なく、関数の格納を開始したときだけでした。(メモリ アドレスを使用して) opCmp を挿入すると、すべてが正常に動作するように見えますが、MyInterface は実際には比較できないため、必要がない限り実行しないことをお勧めします。可能であれば、匿名クラスで opCmp が呼び出される理由/場所、およびそれを回避または回避する方法を知りたいです。
注: Object の opCmp のデフォルトの実装には、漠然とバグを参照するコメント、コメント アウトされたメモリ アドレス比較、およびスロー バージョンが含まれます。
ありがとう!
編集:私は、windbg と ddbg の両方を試して、opCmp が呼び出された場所を正確に追跡しようとしましたが、どちらの場合も失敗しました。Windbg はシンボルの読み込みを頑固に拒否し、ddbg はシンボルを読み込みましたが、初期化中 (静的モジュール コンストラクターの後、メインの前) に例外が発生し、おそらく ddbg は druntime シンボルにアクセスできなかったため、有益な情報を提供しませんでしたか?