11

Mam metodę, która zwraca IEnumerable<> które buduje się przy użyciu składni yield return:problem z zegarkiem debugowania w Visual Studio z metodami wyliczający obie wydajność

namespace Validation 
{ 
    public class UserValidator 
    { 
     public IEnumerable<ValidationError> Validate(User user) 
     { 
      if (String.IsNullOrEmpty(user.Name)) 
      { 
       yield return new ValidationError("Name", ValidationErrorType.Required); 
      } 

      [...] 

      yield break; 
     } 
    } 
} 

Jeśli mogę umieścić punkt przerwania w metodzie, mogę krok na każdej linii, ale gdy próbuję użyć Watch lub natychmiastowy okna, aby wyświetlić wartość zmiennej otrzymuję ten błąd:

Cannot access a non-static member of outer type 'Validation.UserValidator.Validate' via nested type 'Validation.UserValidator'

czy ktoś wie dlaczego tak jest iw jaki sposób można uzyskać wokół niego?

Odpowiedz

7

OK, właśnie wypróbowałem to i widzę co masz na myśli. To bolesne! Podejrzeń, że ma to związek z zakulisowymi działaniami kompilatora (tworzenie klas zagnieżdżonych itp.) W celu implementacji logiki stanu maszyny ze wznowieniem stanu dla yield. Jednym ze sposobów obejścia tego problemu (tak jak początkowo wypróbowałem twój kod) jest uczynienie metody Validate statyczną, chociaż oczywiście nie jest to dobre dla projektu.

Myślę, że powodem jest komunikat o błędzie jest tak tępy jest jakąś kombinację:

  1. Generowane zajęcia nie istnieje w źródle, więc VS nie ma nazwy, dzięki którym odnosi się do nich.
  2. IIRC, nazwy generowane przez kompilator zawierają znaki niedozwolone w identyfikatorach C#, ale ważne w bazowym systemie typu Framework.

Nie mam teraz reflektora, więc nie mogę tego potwierdzić, ale jeśli czujesz się jak masochizm, pomyśl o swoim zespole i spójrz na kod napisany przez kompilator pozwól nam, zwykłym śmiertelnikom, używać ładnego cukru syntaktycznego, takiego jak yield return :) W Internecie jest dużo informacji o tym, jak dokładnie to wszystko działa.

Edit: po trochę więcej poszukiwań, kilka z tych lepszych:
http://blogs.msdn.com/b/ericlippert/archive/tags/iterators/
http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx

+0

Dzięki za shambulator odpowiedzi. Domyślam się, że odpowiedź na pytanie "jak mogę to obejść" jest częścią mojego pytania: "nie możesz bez zmiany projektu"? – stusherwin

+0

Boi się tak, przynajmniej tak daleko, jak widzę. – shambulator

3

miałem podobne problemy, a co mam zrobić jest zmiana realizację budować listę elementów, a następnie zwróć listę.

To pozwoliło mi znaleźć błąd, poprawić go. Po poprawieniu błędu zmieniam implementację z powrotem na powrót zwrotu.

Bolesne.

4

Metoda nie zostanie uruchomiona, dopóki jej nie wyliczysz.

var p = UserValidator.Validate(user).ToList(); 

Możesz teraz debugować swój kod.

+0

Myślę, że mogłeś źle zrozumieć pytanie :) – stusherwin

Powiązane problemy