Question

I ai une méthode qui renvoie un IEnumerable<> lequel il construit à l'aide de la syntaxe de yield return:

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;
        }
    }
}

Si je mets un point d'arrêt dans la méthode, je peux enjamber chaque ligne, mais si je tente d'utiliser les fenêtres regarder ou immédiat pour afficher la valeur d'une variable-je obtenir cette erreur:

  

Impossible d'accéder à un membre non-statique   Type extérieur 'Validation.UserValidator.Validate' via   type imbriqué 'Validation.UserValidator'

Quelqu'un sait pourquoi il en est et comment je peux contourner?

Était-ce utile?

La solution

OK, juste essayé dehors et je vois ce que vous voulez dire. C'est douloureux! Je soupçonne que cela a à voir avec les arrière-scènes de travail du compilateur ne (création de classes imbriquées et autres) pour implémenter la logique machine de type état resumable pour yield. Une façon de contourner (la façon dont je l'origine essayé votre code) est de rendre la méthode Validate statique, bien évidemment ce ne est pas super pour la conception.

Je pense que la raison pour laquelle le message d'erreur est si obtus est une combinaison de:

  1. Les classes générées n'existent pas dans votre source, donc VS n'a pas de nom par lequel les consulter.
  2. IIRC, les noms générés par le compilateur contient des caractères illégaux dans les identificateurs C #, mais valables dans le système de type cadre sous-jacent.

Je n'ai pas droit réflecteur à portée de main maintenant, peut donc pas confirmer, mais si vous vous sentez comme une tache de lumière du masochisme, réfléchir sur votre montage et jeter un oeil sur le code du compilateur écrit pour nous laisser simple mortels utilisent bien le sucre syntaxique comme yield return :) Il y a beaucoup d'informations disponibles sur le web sur la façon dont tout cela fonctionne exactement.

Modifier après un peu plus de recherche, un couple des meilleurs:
http://blogs.msdn.com/b/ericlippert/archive/tags/ itérateurs /
http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx

Autres conseils

La méthode ne fonctionne jusqu'à ce que vous énumérez en elle.

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

Vous pouvez maintenant déboguer votre code.

J'ai eu des problèmes similaires, et ce que je l'ai fait est de modifier la mise en œuvre pour construire une liste d'éléments, puis retourner la liste.

Cela m'a permis de trouver le bug, la corriger. Après le bug a été corrigé, je change le dos de la mise en œuvre à un retour de rendement.

Douloureux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top