Рассмотрим следующий пример кода:
static void Main(string[] args)
{
bool same = CreateDelegate(1) == CreateDelegate(1);
}
private static Action CreateDelegate(int x)
{
return delegate { int z = x; };
}
Вы бы предположили, что два экземпляра делегата будут сравниваться как равные, как и при использовании метода старого старого метода (новый Action (MyMethod)). Они не сравниваются, чтобы быть равными, потому что .NET Framework предоставляет скрытый экземпляр закрытия на экземпляр делегата. Поскольку эти два экземпляра делегата имеют свои свойства Target, заданные их индивидуальным скрытым экземпляром, они не сравниваются. Одним из возможных решений является генерируемый IL для анонимного метода для хранения текущего экземпляра (этого указателя) в целевом элементе делегата. Это позволит делегатам правильно сравнивать, а также помогает с точки отладчика, так как вы увидите, что ваш класс является целью, а не скрытым классом.
Вы можете узнать больше об этой проблеме в ошибке, которую я отправил в Microsoft. Отчет об ошибке также дает пример того, почему мы используем эту функциональность, и почему мы считаем, что ее нужно изменить. Если вы считаете, что это тоже проблема, пожалуйста, помогите поддержать ее, предоставив рейтинг и подтверждение.
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=489518
Вы можете увидеть любую возможную причину, по которой функциональность не должна изменяться? Считаете ли вы, что это лучший способ решения проблемы, или вы рекомендуете мне пойти по другому пути?