C# - foreach

创建时间:
2015-06-04 21:03
最近更新:
2018-08-22 19:58

foreach 中 修改元素无效 及其解决方案

测试环境

  • 2018-08-22
  • Visual Studio 2013
  • CodeGen 项目

赋值失败

IEnumerable<SelectListItem> items = ***;
foreach(var item in items) {
    item.Value = ***;
    //此时 item.Value 已被改变。
}
//此时 items 中的所有 item.Value 未改变。

赋值成功

IEnumerable<SelectListItem> items = ***;
items = items.Select(e => {
    e.Value = ***;
    return e;
});
//此时 items 中的所有 item.Value 已被改变。

原因

网摘、未验证: 注意 object System.Collections.IEnumerator.Current { get; }T System.Collections.Generic.IEnumerator<out T>.Current { get; },它们都是只读属性。

foreach 入参为 null 时将抛出异常

[TestMethod]
public void ForeachCanNotAcceptNull()
{
    try {
        string[] array = null;
        foreach(var item in array) {
            string s = item;
        }
    }
    catch(System.Exception ex) {
        string message = ex.Message;
        /*
        捕捉到 System.NullReferenceException
        _HResult=-2147467261
        _message=未将对象引用设置到对象的实例。
        HResult=-2147467261
        IsTransient=false
        Message=未将对象引用设置到对象的实例。
        Source=FC.CG.ContractPay.Bll.Test
        StackTrace:
        在 ... 位置 d:\...\CpAccounting_Test.cs:行号 17
        InnerException:
        */
        throw;
    }
}