You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复C#代码中permission.Permissions[1].ToList()的报错问题?

解决C#异步方法中转换List集合的报错问题

报错原因分析

permission.Permissions[1].ToList()报错通常有以下几种可能:

  • 索引越界:Permissions集合元素数量不足2个(索引从0开始),直接取[1]会抛出IndexOutOfRangeException
  • Permissions[1]本身为null,调用ToList()时触发NullReferenceException
  • Permissions[1]的类型不是IEnumerable<T>,无法直接调用ToList()扩展方法

修正方案

针对上述问题,做以下优化:

  1. 先校验Permissions集合有效性,避免索引越界和空引用
  2. 针对Permissions[1]的实际类型做兼容处理,确保能正确转换为List
  3. 增加空值判断,提升代码健壮性

修正后的完整代码

public async Task PopulateModels()
{
    try
    {
        var permission = await GetUserPermission();
        List<Model.Location> locations = new List<Model.Location>();

        // 校验Permissions集合及目标元素的有效性
        if (permission?.Permissions != null && permission.Permissions.Count > 1)
        {
            var permissionItem = permission.Permissions[1];
            // 若元素是可枚举的Location集合,直接转List
            if (permissionItem is IEnumerable<Model.Location> locationEnumerable)
            {
                locations = locationEnumerable.ToList();
            }
            // 若元素是单个Location对象,包装为List
            else if (permissionItem is Model.Location singleLocation)
            {
                locations.Add(singleLocation);
            }
        }

        var users = await _userService.GetAllUsers();
        // 用LINQ简化UserSelectListViewModel集合构建
        var userSelectListViewModels = users
            .Select(user => new UserSelectListViewModel
            {
                Id = user.PkId,
                Name = $"{user.FirstName} {user.LastName}"
            })
            .OrderBy(e => e.Name)
            .ToList();
        
        UserList = new SelectList(userSelectListViewModels, "Id", "Name");

        locations.Sort((x, y) => string.CompareOrdinal(x.Name, y.Name));
        var selected = new Model.Location
        {
            PkId = 0,
            Name = "Select Location"
        };
        locations.Insert(0, selected);
        LocationList = new SelectList(locations, "PkId", "Name");
    }
    catch (Exception ex)
    {
        _logger.LogError(ex.Message, ex);
        throw;
    }
}

额外优化说明

  • 用LINQ的Select替代foreach循环,简化集合构建代码
  • 增加多层空值校验,避免运行时异常
  • 兼容单个对象和集合两种场景,提升代码通用性

内容的提问来源于stack exchange,提问作者Ram prasad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:23:10