考虑以下示例代码:
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))一样。它们不相等,因为 .NET Framework 为每个委托实例提供了一个隐藏的闭包实例。由于这两个委托实例都将其 Target 属性设置为各自的隐藏实例,因此它们不进行比较。一种可能的解决方案是为匿名方法生成的 IL 将当前实例(this 指针)存储在委托的目标中。这将允许委托进行正确比较,并且从调试器的角度来看也有帮助,因为您将看到您的类是目标,而不是隐藏类。
您可以在我提交给 Microsoft 的错误中阅读有关此问题的更多信息。错误报告还举例说明了我们为什么使用此功能,以及为什么我们认为应该更改它。如果您也觉得这也是一个问题,请通过提供评级和验证来帮助支持它。
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=489518
您能看出不应更改功能的任何可能原因吗?您认为这是解决问题的最佳做法,还是建议我采取不同的方法?