私が理解しているように、C#のforeach反復変数は不変です。C#foreach文の反復変数が読み取り専用であるのはなぜですか?
foreach (Position Location in Map)
{
//We want to fudge the position to hide the exact coordinates
Location = Location + Random(); //Compiler Error
Plot(Location);
}
私が直接イテレータ変数を変更することはできません、代わりに、私が来るループ
for (int i = 0; i < Map.Count; i++)
{
Position Location = Map[i];
Location = Location + Random();
Plot(Location);
i = Location;
}
のために使用する必要があります:私はこのようなイテレータを変更することはできません意味
C++のバックグラウンドからは、forループの代わりにforeachが使用されています。しかし、上記の制限では、私は通常、forループを使用することにフォールバックします。
私は不思議ですが、反復子を不変にする背景には何がありますか?
編集:
この質問は、コーディングの問題として好奇心の質問のよりではありません。私はコーディングの答えを高く評価しましたが、答えとしてマークすることはできません。
また、上記の例は過度に簡略化されています。ここで私は何をしたいのC++の例である:
// The game's rules:
// - The "Laser Of Death (tm)" moves around the game board from the
// start area (index 0) until the end area (index BoardSize)
// - If the Laser hits a teleporter, destroy that teleporter on the
// board and move the Laser to the square where the teleporter
// points to
// - If the Laser hits a player, deal 15 damage and stop the laser.
for (int i = 0; i < BoardSize; i++)
{
if (GetItem(Board[i]) == Teleporter)
{
TeleportSquare = GetTeleportSquare(Board[i]);
SetItem(Board[i], FreeSpace);
i = TeleportSquare;
}
if (GetItem(Board[i]) == Player)
{
Player.Life -= 15;
break;
}
}
イテレータ私は不変であるので、私はC#のforeachの中に上記の操作を行うことはできません。私は(私が間違っている場合は私を修正してください)、これは言語のforeachの設計に固有のものだと思います。
なぜforeachイテレータが不変であるのか興味があります。
Good find。私はそれまで気づかなかったことに驚いています。 –
2番目の例でも実際に配列要素を変更していません。 –
@Jakob、私は本当に配列要素を変更することに興味がありません。私はイテレータがなぜ不変であるのかにもっと興味があります。私はそれを明確にするために質問を編集する必要があると思う。 – MrValdez