如何修复C#代码中permission.Permissions[1].ToList()的报错问题?
解决C#异步方法中转换List集合的报错问题
报错原因分析
permission.Permissions[1].ToList()报错通常有以下几种可能:
- 索引越界:
Permissions集合元素数量不足2个(索引从0开始),直接取[1]会抛出IndexOutOfRangeException Permissions[1]本身为null,调用ToList()时触发NullReferenceExceptionPermissions[1]的类型不是IEnumerable<T>,无法直接调用ToList()扩展方法
修正方案
针对上述问题,做以下优化:
- 先校验
Permissions集合有效性,避免索引越界和空引用 - 针对
Permissions[1]的实际类型做兼容处理,确保能正确转换为List - 增加空值判断,提升代码健壮性
修正后的完整代码
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
相关产品推荐
相关产品推荐

