実際には、IEnumerator.Reset
method should never be usedList<T>
のメソッド実装の奇妙な動作が見つかりました。リスト<T> .Enumerator IEnumerator.Reset()メソッドの実装
は、どんなにあなたが.NET Frameworkのソースコードを調べる方法を、以下のような方法が実装されている(参照元とILSpyで試した):
void System.Collections.IEnumerator.Reset() {
if (version != list._version) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
index = 0;
current = default(T);
}
しかし、それはすべてのメソッドが呼び出されないように見えます!それは二回True
と3
を印刷する必要があること、それはかなり明確だ
var list = new List<int>(1) { 3 };
using (var e = list.GetEnumerator())
{
Console.WriteLine(e.MoveNext());
Console.WriteLine(e.Current);
((IEnumerator)e).Reset();
Console.WriteLine(e.MoveNext());
Console.WriteLine(e.Current);
}
:コードを考えてみましょう。その代わりに結果は
True
3
False
0
私は行方不明ですか?
が変更可能な構造体は悪である理由の新しい一例であることが判明しました。明示的なインターフェース実装を通して突然変異が起こる変更可能な構造体はちょっとした悪事です。しかし、これらのネストされた 'Enumerator'構造体は通常、' foreach'文を翻訳するときにC#コンパイラによってのみ使用されます。 –