2010-03-30 4 views
4

Le compilateur, étant donné le code suivant, me dit "Utilisation de la variable locale non assignée 'x'." Des pensées?La boucle foreach générique en C#

public delegate Y Function<X,Y>(X x); 

public class Map<X,Y> 
{ 
    private Function<X,Y> F; 

    public Map(Function f) 
    { 
     F = f; 
    } 

    public Collection<Y> Over(Collection<X> xs){ 
     List<Y> ys = new List<Y>(); 
     foreach (X x in xs) 
     { 
      X x2 = x;//ys.Add(F(x)); 
     } 
     return ys; 
    } 
} 
+0

Pourriez-vous publier l'erreur complète? Et est-ce le vrai code? –

+0

En outre, quelle version de .Net utilisez-vous? –

+0

Après avoir réparé les autres erreurs dans le code, je ne reçois pas cette erreur. À quoi ressemble votre code? – Guffa

Répondre

6

Après avoir corrigé les erreurs évidentes, il compile bien pour moi.

public delegate Y Function<X,Y>(X x); 

public class Map<X,Y> 
{ 
    private Function<X,Y> F; 

    public Map(Function<X,Y> f) 
    { 
     F = f; 
    } 

    public ICollection<Y> Over(ICollection<X> xs){ 
     List<Y> ys = new List<Y>(); 
     foreach (X x in xs) 
     { 
      X x2 = x;//ys.Add(F(x)); 
     } 
     return ys; 
    } 
} 
+1

+1, tu m'as battu dessus. –

2

La spécification du langage définit instruction foreach comme l'équivalent d'une boucle while, dans lequel la variable de boucle est assignée à la propriété Current de l'objet énumérateur. Cela satisfait définitivement les règles d'affectation définies de tout compilateur C# conforme pour cet extrait de code. Soit vous utilisez un compilateur non conforme, soit l'erreur vient d'ailleurs.

2

Ce: public Map(Function f)

devrait être:

public Map(Function<X,Y> f) 

Et ceci:

public Collection<Y> Over(Collection<X> xs) 

devrait être:

public ICollection<Y> Over(ICollection<X> xs) 

Ou:

public List<Y> Over(Collection<X> xs) 
+1

ou IEnumerable puis vous pouvez jeter la liste et remplacer le '.Add (...)' par 'yield return ...' –