これは、クラスにIEnumerableを実装する際に私が遭遇した面白いエラーです。それは "変更された閉鎖へのアクセス"の問題に似ているように見えますが、私はそれを修正する方法を失っています。ここでIEnumerable <T>を実装しているときに、ポインタの誤指示が確認されました
が問題を示していますシンプルな例です:あなたはDump()
の文から見ることができるように
void Main()
{
var nodeCollection = new NodeCollection();
nodeCollection.MyItems = new List<string>() { "a", "b", "c" };
foreach (var node in nodeCollection)
{
node.Dump();
}
}
public class NodeCollection : IEnumerable<Node>
{
public List<string> MyItems;
public IEnumerator<Node> GetEnumerator()
{
// This isn't necessary, but it should prove that it's not an "access to modified closure" issue.
var items = MyItems;
for (var i = 0; i < 3; i++)
{
var node = new Node();
// I want the node to contains the items in MyItems.
node.Items = items;
// Plus an additional item. Note that I am adding the item to the node, NOT to MyItems.
node.Items.Add(string.Format("iteration: {0}", i));
yield return node;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class Node
{
public List<string> Items;
}
、私はLINQPadでこれを実行しているんだけど、問題は、任意のIDEで自分自身を紹介します。
私はスニペットを実行すると、私は次のような出力が得られます。
私は新たにインスタンス化されたNode
にItems
に項目を追加していますので、私はアイテムがMyItems
に追加されることを期待しないだろうしかし、これは明らかに何が起こっているかです。
Node
のItems
がをNodeCollection
としているようです。
誰も教えてもらえます:
- これが起こっているのはなぜ?
- どのように起こらないようにするには?
これは私がSOを愛する理由です。私にとって完全に困惑していることは他人には明らかです。私はまだ行動をかなり理解していない、私に数分を与える... – Anders
コメントの真ん中に私の更新を見て、 "私はここで基本的な誤解と思う..." –
それは意味がある、何らかの理由で既存のものを指すのではなく、リストをコピーしていると思っていました。 – Anders