Wszystko sprowadza się do: kiedy dwaj delegaci są traktowani tak samo dla celów delegowania dodawania/odejmowania. Kiedy zrezygnujesz z subskrypcji, zasadniczo używa logiki od Delegate.Remove
, która uznaje dwóch delegatów za równorzędną, jeśli zarówno dopasowanie .Target
, jak i .Method
jest zgodne (przynajmniej dla prostego przypadku delegata z pojedynczą metodą docelową, a multicast jest bardziej skomplikowany do opisania) . A więc: co to jest .Method
i .Target
na lambda (zakładając, że kompilujemy go do delegata , a nie do wyrażenia)?
Co to nie zrobić, jest jednak porównać wiele lambdas z podobnymi organami pragnących zmniejszyć wszelkie . Więc co mam kiedy skompilować kod jest dwa statyczne metody:
[CompilerGenerated]
private static void <Main>b__0(object s, string e)
{
Console.WriteLine("Bark: {0}", e);
}
[CompilerGenerated]
private static void <Main>b__2(object s, string e)
{
Console.WriteLine("Bark: {0}", e);
}
(Main
jest tu tylko dlatego, że w moim stanowisku badawczym te lambdas są wewnątrz metody Main
- ale ostatecznie kompilator może wybrać dowolny niewymawialne nazwy, które wybiera tutaj)
Pierwsza metoda jest używana przez pierwszą wartość lambda; druga metoda jest używana przez drugą lambdę.Tak więc ostatecznie nie działa, ponieważ .Method
nie pasuje.
W regularnych C# warunkach, byłoby jak robi:
obj.SomeEvent += MethodOne;
obj.SomeEvent -= MethodTwo;
gdzie MethodOne
i MethodTwo
mają ten sam kod wewnątrz nich; nic nie anuluje.
Może być piękny jeśli kompilator zauważony, ale nie jest to wymagane do , i jako taka jest bezpieczniejsza, że nie wybranych do - może to oznaczać, że różne kompilatory rozpocząć produkcję bardzo różne wyniki.
Na marginesie; może to być bardzo mylące, jeśli to zrobi próbować usunąć duplikat, ponieważ masz również problem z kontekstami przechwytywania - wtedy byłoby tak, że "działało" w niektórych przypadkach, a nie innych - bez bycia oczywistym, które - prawdopodobnie najgorszy możliwy scenariusz.
http://stackoverflow.com/questions/183367/unsubscribe-anonymous-method-in-c- sharp –
Tak, to przedstawia to samo, co w artykule, ale nie wyjaśnia, dlaczego. – DaveDev
@TimSchmelter niestety moja przeglądarka może zobaczyć tylko w przeszłości. – DaveDev