Tak, istnieje bardzo dobry powód, dla którego nie można tego zrobić. Prostym powodem są koszty. Koszt włączenia tej funkcji w języku C# (lub VB) wynosi wyjątkowo wysoki:.
Edycja funkcji lambda jest specyficznym przypadkiem klasy problemów ENC, które są bardzo trudne do rozwiązania przy obecnej architekturze ENC (Edit'n'Continue). Mianowicie, jest to bardzo trudne do ENC każda metoda, która gdzie ENC ma jedną z następujących czynności: -
- Generuje metadane w postaci klasy
- Edycje lub generuje ogólną metodę
pierwsze wydanie jest raczej ograniczeniem logicznym, ale także wpada w kilka ograniczeń w architekturze ENC. Mianowicie problem generowania pierwszej klasy nie jest strasznie trudny. To, co przeszkadza, to generowanie klasy po drugiej edycji. Silnik ENC musi rozpocząć śledzenie tabeli symboli nie tylko pod kątem kodu na żywo, ale także wygenerowanych klas. Zwykle nie jest tak źle, ale staje się to coraz trudniejsze, gdy kształt generowanej klasy jest oparty na kontekście, w którym jest używany (tak jak w przypadku lambdas z powodu zamknięć). Co ważniejsze, w jaki sposób rozwiązujesz różnice w stosunku do instancji klas, które już są aktywne w procesie?
Druga kwestia to ścisłe ograniczenie architektury CLR ENC. Nie ma nic, co C# (lub VB) może zrobić, aby obejść to.
Niestety Lambdas trafił w oba te problemy. Krótka wersja jest taka, że ENC'ing lambda obejmuje wiele mutacji na istniejących klasach (które mogą lub nie zostały wygenerowane z innych ENC). Duży problem polega na rozwiązaniu różnic między nowym kodem a istniejącymi instancjami zamykającymi, które są żywe w obecnej przestrzeni procesowej. Ponadto lambdy często używają generycznych o wiele więcej niż inne kody i trafiają w numer 2.
Szczegóły są dość owłosione i nieco zbyt zaangażowane, aby uzyskać zwykłą odpowiedź na WR. Rozważałem napisanie długiego blogu na ten temat. Jeśli się do tego zabiorę, powiążę go z tą konkretną odpowiedzią.
Prosto z ust konia. +1 –
@Jon Mieliśmy wiele wewnętrznych spotkań na ten temat i musiałem wielokrotnie prezentować tę prezentację. Naprawdę muszę napisać pełny dokument na ten temat. Blogowanie wydaje się dobrym miejscem na to. Istnieje nadzieja, że zostanie to rozwiązane w przyszłej wersji VS. – JaredPar
Napisz o tym blogu. – Eyvind