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