先看下面兩個接口:
namespace System.Collections
{
// 摘要:
// 支持對非泛型集合的簡單迭代。
[ComVisible(true)]
[Guid("496B0ABF-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerator
{
// 摘要:
// 獲取集合中的當前元素。
//
// 返回結果:
// 集合中的當前元素。
//
// 異常:
// System.InvalidOperationException:
// 枚舉數定位在該集合的第一個元素之前或最後一個元素之後。
object Current { get; }
bool MoveNext();
void Reset();
}
}
namespace System.Collections
{
// 摘要:
// 公開枚舉數,該枚舉數支持在非泛型集合上進行簡單迭代。
[ComVisible(true)]
[Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")]
public interface IEnumerable
{
// 摘要:
// 返回一個循環訪問集合的枚舉數。
//
// 返回結果:
// 可用於循環訪問集合的 System.Collections.IEnumerator 對象。
[DispId(-4)]
IEnumerator GetEnumerator();
}
}
每個實現的迭代器,返回類型必須爲 IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>。foreach中的迭代變量是即爲IEnumerable、IEnumerator、IEnumerable<T> 或 IEnumerator<T>類型。從上面的接口可以看出,object Current是隻讀的,因此,foreach迭代變量只能是隻讀的。
另:
foreach中的迭代變量本來就是隻讀,不可修改的。
對值類型中的屬性賦值,會改變值類型對象在棧上的內存分步,所以實際上就是對值類型對象本身重新賦值了