C#代码从Net5.0迁移至Netstandard2.1出现CS0266隐式转换错误如何解决
错误原因
你写的代码里多了不必要的ToString()调用:Enum.GetValues(typeof(Direction))本身返回枚举值数组,你强制转换为Direction[]后直接调用ToString(),会将整个数组转换为字符串类型(值为"H3.Model.Direction[]"这类字符串),后续ToDictionary会遍历字符串的每个char字符作为输入,自然无法和Direction类型匹配,就抛出了类型转换错误。
原始代码逻辑很简单:遍历Direction枚举的所有可选值,以枚举值本身作为字典的Key,对应Value按照规则生成:
- 当枚举值为
Direction.Invalid时,使用预设的无效坐标CoordIJK.InvalidIJKCoordinate - 其余枚举值直接取
UnitVectors数组中对应下标的值(数组下标就是枚举值的int值)
最终得到一个完整的Direction到CoordIJK的映射字典。
修复后的代码
直接去掉多余的ToString()即可,如果不确定开发环境是否支持C# 8.0以上的switch表达式,可以用传统分支写法兼容:
using System.Linq; // 需确保引入Linq命名空间 public static readonly Dictionary<Direction, CoordIJK> DirectionToUnitVector = ((Direction[])Enum.GetValues(typeof(Direction))).ToDictionary(e => e, e => { if (e == Direction.Invalid) return CoordIJK.InvalidIJKCoordinate; return UnitVectors[(int)e]; });
如果确认环境支持C# 8.0及以上版本(.NET Standard 2.1默认支持),也可以保留原来的switch表达式写法:
using System.Linq; public static readonly Dictionary<Direction, CoordIJK> DirectionToUnitVector = ((Direction[])Enum.GetValues(typeof(Direction))).ToDictionary(e => e, e => e switch { Direction.Invalid => CoordIJK.InvalidIJKCoordinate, _ => UnitVectors[(int)e] });
内容的提问来源于stack exchange,提问作者infinityplusb
相关产品推荐
相关产品推荐

