Linq側で元のIEnumerableへの変更を監視して丁寧に例外吐いてるからですわね。コンパイル時になんとかなさい、それはそう。
コレクション側で管理してるのでそんなこと知ったこっちゃないコレクション型つくればおk。
たとえばSystem.IO.Directory.EnumerateFiles()なんかは別に呼び出しから列挙までの間にファイルができても(どういう動作になるかとかどういう動作が保証されるかは別として)例外は起きないはず
コレクション型じゃなくてイテレータ型か
外法を考えました
```cs
var collection = new List<T>();
...
...
foreach (var item in collection)
{
//変更前のListバージョンを取得
var versionField = collection.GetType().GetField("_version", BindingFlags.GetField | BindingFlags.Private | BindingFlags.Instance);
int version = (int)versionField.GetValue(collection);
//ここで元コレクションを変更
collection.Add(item);
//バージョンを戻す
versionField.SetValue(collection, version);
}
```
試してないので動くかどうかは知りません
すぐメタプロに走る癖を直せ