ToDictionary()返回可空字典,如何转为非空Dictionary<string,string>?
解决IdentityResult.Errors创建字典时类型为可空的问题
问题出在启用了**Nullable Reference Types(可空引用类型)**的项目中,ASP.NET Core Identity的IdentityResult.Errors属性被定义为IEnumerable<IdentityError>?(即可空类型)。编译器的静态分析会认为result.Errors可能为null,因此推断ToDictionary的返回类型为Dictionary<string, string>?,但实际上如果result.Errors为null,调用ToDictionary会直接抛出ArgumentNullException,不会返回null。
以下是几种解决办法:
- 如果你确定
result.Errors绝对不会为null,可以用**null-forgiving运算符(!)**告诉编译器忽略可空警告:
var dictionary = result.Errors!.ToDictionary(e => e.Code, e => e.Description);
- 提前做空检查,处理
Errors为null的情况:
Dictionary<string, string> dictionary; if (result.Errors == null) { dictionary = new Dictionary<string, string>(); // 或者根据业务需求处理 } else { dictionary = result.Errors.ToDictionary(e => e.Code, e => e.Description); }
- 用空合并运算符
??给Errors设置默认的空集合,确保不会传递null给ToDictionary:
var dictionary = (result.Errors ?? Enumerable.Empty<IdentityError>()).ToDictionary(e => e.Code, e => e.Description);
这样处理后,dictionary的类型就会被推断为非可空的Dictionary<string, string>。
内容的提问来源于stack exchange,提问作者KTOV
相关产品推荐
相关产品推荐

