2010-03-30 70 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