让我们从一个愚蠢但说明性的示例开始:
Object o = 15;
o = "apples";
我们从来没有感觉到我们只是将数字15变成了一串苹果。我们知道那o
仅仅是一个指针。现在,以迭代器形式进行操作。
int[] nums = { 15, 16, 17 };
foreach (Object o in nums) {
o = "apples";
}
再一次,这真的什么也做不了。或至少编译它 不会 完成任何工作。它当然不会将我们的字符串插入到int数组中- 这是不允许的,而且我们知道这o
仍然只是一个指针。
让我们举个例子:
foreach (Position Location in Map)
{
//We want to fudge the position to hide the exact coordinates
Location = Location + Random(); //Compiler Error
Plot(Location);
}
如果要进行编译,则Location
在您的示例中,会突出显示引用中的值Map
,然后您将其更改为引用一个新值Position
(由加法运算符隐式创建)。从功能上讲,它等效于此(可以编译):
foreach (Position Location in Map)
{
//We want to fudge the position to hide the exact coordinates
Position Location2 = Location + Random(); //No more Error
Plot(Location2);
}
那么,为什么Microsoft禁止您重新分配用于迭代的指针?一件事很清楚- 您不希望有人指派他们以为他们在循环中已经改变了您的位置。易于实施:变量可能隐藏一些内部逻辑,以指示正在进行的循环状态。
但更重要的是,您没有理由 要 分配给它。它代表循环序列的当前元素。如果您遵循“编码恐怖”,则为其分配值将违反“单一责任原则”或@L_419_0@。变量仅意味着一件事。