让我们从一个愚蠢但说明性的示例开始:
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禁止您重新分配用于迭代的指针?一件事很清楚-
您不希望有人指派他们以为他们在循环中已经改变了您的位置。易于实施:变量可能隐藏一些内部逻辑,以指示正在进行的循环状态。
但更重要的是,您没有理由 要
分配给它。它代表循环序列的当前元素。如果您遵循“编码恐怖”,则为其分配值将违反“单一责任原则”或柯里定律。变量仅意味着一件事。



