2010-03-30 54 views
4

编译器给出以下代码,告诉我“使用未分配的局部变量'x'。”有什么想法吗?C中的通用foreach循环#

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

你能发布整个错误吗?这是真正的代码吗? – 2010-03-30 18:30:18

+0

另外,你使用的是什么版本的.Net? – 2010-03-30 18:30:55

+0

在修复代码中的其他错误之后,我没有看到那个错误。你的代码实际上是什么样的? – Guffa 2010-03-30 18:34:50

回答

6

在修复了显而易见的错误之后,它为我编译好了。

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,你打败了我。 – 2010-03-30 18:38:30

2

语言规范定义foreach语句作为while循环,其中循环变量被分配给枚举器对象的属性Current的等效。这绝对满足该代码片段中任何符合C#编译器的明确分配规则。要么你使用的是不合规的编译器,要么是来自其他地方的错误。

2

这个:public Map(Function f)

应该是:

public Map(Function<X,Y> f) 

这:

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

应该是:

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

或者:

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

或IEnumerable 然后你可以折腾列表并用'yield return ...替换'.Add(...)'...' – 2010-03-30 18:45:58