次のコード例を検討してください。
static void Main(string[] args)
{
bool same = CreateDelegate(1) == CreateDelegate(1);
}
private static Action CreateDelegate(int x)
{
return delegate { int z = x; };
}
古き良き名前付きメソッド アプローチ (new Action(MyMethod)) を使用する場合と同様に、2 つのデリゲート インスタンスを比較すると等しいと想像できます。.NET Framework はデリゲート インスタンスごとに非表示のクロージャ インスタンスを提供するため、両者は等しいとは言えません。これら 2 つのデリゲート インスタンスはそれぞれ、Target プロパティが個別の隠しインスタンスに設定されているため、比較されません。考えられる解決策の 1 つは、匿名メソッド用に生成された IL が現在のインスタンス (このポインター) をデリゲートのターゲットに格納することです。これにより、デリゲートを正しく比較できます。また、隠しクラスではなく、クラスがターゲットであることがわかるため、デバッガーの観点からも役立ちます。
この問題の詳細については、私が Microsoft に提出したバグを参照してください。バグ レポートには、この機能を使用している理由と、変更する必要がある理由の例も示されています。これも問題だと思われる場合は、評価と検証を提供してサポートしてください。
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=489518
機能を変更すべきではない理由が考えられますか? これが問題を解決するための最善の行動だったと思いますか、それとも別の方法を取ることをお勧めしますか?