C#中的通用foreach循环

时间:2010-03-30 18:27:14

标签: c# generics foreach

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

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

3 个答案:

答案 0 :(得分:7)

在解决了明显的错误之后,我编译好了。

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 :(得分:2)

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

答案 2 :(得分: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)