Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 枚举器的行为会根据我们引用它的方式发生变化吗?_C#_Ienumerable - Fatal编程技术网

C# 枚举器的行为会根据我们引用它的方式发生变化吗?

C# 枚举器的行为会根据我们引用它的方式发生变化吗?,c#,ienumerable,C#,Ienumerable,将对列表枚举数的引用包装在类中似乎会改变其行为。匿名类的示例: public static void Main() { var list = new List<int>() { 1, 2, 3 }; var an = new { E = list.GetEnumerator() }; while (an.E.MoveNext()) { Debug.Write(an.E.Current); } } publicstaticvoi

将对列表枚举数的引用包装在类中似乎会改变其行为。匿名类的示例:

public static void Main()
{
    var list = new List<int>() { 1, 2, 3 };
    var an = new { E = list.GetEnumerator() };
    while (an.E.MoveNext())
    {
        Debug.Write(an.E.Current);
    }
}
publicstaticvoidmain()
{
var list=newlist(){1,2,3};
var an=new{E=list.GetEnumerator()};
while(an.E.MoveNext())
{
调试.写入(一个E.Current);
}
}
我希望它能打印“123”,但它只打印零,而且永远不会终止。与具体类相同的示例:

public static void Main()
{
    var list = new List<int>() { 1, 2, 3 };
    var an = new Foo()
    {
        E = list.GetEnumerator()
    };

    while (an.E.MoveNext())
    {
        Debug.Write(an.E.Current);
    }
}

public class Foo
{
    public List<int>.Enumerator E { get; set; }
}
publicstaticvoidmain()
{
var list=newlist(){1,2,3};
var an=new Foo()
{
E=list.GetEnumerator()
};
while(an.E.MoveNext())
{
调试.写入(一个E.Current);
}
}
公开课Foo
{
public List.Enumerator E{get;set;}
}

发生了什么事?

我测试了它,但对我来说,它也不适用于您的具体类

原因是
List.Enumerator
是一个可变的
struct
,而
an.E
是一个属性

编译器为每个自动属性生成一个支持字段,如下所示:

public class Foo
{
    private List<int>.Enumerator _E;
    public List<int>.Enumerator get_E() { return E; }
    public void set_E(List<int>.Enumerator value) { E = value; }
}

如果分配
E=list.GetEnumerator()
现在,枚举数被装箱,存储的是引用而不是值。

Foo
中使用公共字段可以解决问题。很好。@Jonesopolis是的,当然。通过使用直接访问值(结构)的字段,属性返回一个副本
public class Foo
{
    public IEnumerator<int> E { get; set; }
}