2009-03-06 8 views
4

Pourquoi la méthode X ci-dessous n'est-elle pas appelée ?!Pourquoi ma méthode C# n'est pas appelée?

static class Program 
{ 
    private static void Main() 
    { 
     X((IEnumerable<int>)null); 
    } 

    public static IEnumerable<T> X<T>(IEnumerable<T> e) 
    { 
     if (e == null) 
      throw new ArgumentNullException(); 
     yield break; 
    } 
} 

J'ai essayé d'entrer dans le débogueur, mais il ne rentre pas X! Est-ce que le mot-clé yield break cause un effet secondaire dont je ne suis pas au courant?

Si cela vaut la peine, j'utilise Visual Studio 2008 Express avec .NET 3.5 SP1.

+0

J'ai minimisé l'exemple pour ne contenir que X, en supprimant X2. –

Répondre

13

X2 est un itérateur et est exécuté en différé. Il ne sera pas réellement exécuté jusqu'à ce que vous essayiez d'obtenir une valeur de l'instance IEnumerable retournée. Vous pouvez résoudre ce problème pour obtenir le comportement dont vous avez réellement besoin en décomposant la fonction en deux parties.

public static IEnumerable<T> X2<T>(IEnumerable<T> e) 
    { 
     if (e == null) 
      throw new ArgumentNullException(); 
     return X2Helper(e); 
    } 

    private static IEnumerable<T> X2Helper<T>(IEnumerable<T> e) 
    { 
     yield break; 
    } 

Eric a un grand message de blog sur ce sujet: http://blogs.msdn.com/ericlippert/archive/2008/09/08/high-maintenance.aspx

+0

Oh, j'ai oublié cette partie. Je vous remercie. –

1

Oui la méthode ne soit pas appelé jusqu'à ce que la méthode GetEnumerator de IEnumerable est appelée.

0

Votre méthode Main() doit également être publique. Sinon, les autres assemblys ne peuvent pas appeler la méthode Main() de votre classe comme point de départ de l'application.

+0

Pourquoi les autres assemblys veulent-ils invoquer ma méthode principale? Je ne peux pas penser à une raison pour cela. –

Questions connexes