C#中enum新增枚举值后Enum.GetValues返回长度未更新问题
枚举
GetValues返回长度固定为134问题排查 问题描述
最初定义的enum类型AdaptedType原有成员总数为134时单元测试执行失败,为该枚举新增更多成员条目后,枚举返回长度始终未发生变化。
尽管当前枚举实际成员数量远多于134,调用Enum.GetValues(typeof(AdaptedType)).Length;的返回结果仍然为134。
涉及的枚举定义代码如下:
public enum AdaptedType { #pragma warning disable 1591 Undefined = -2, Custom = -1, Length = 0, Area = 1, Volume = 2, Angle = 3, Number = 4, SheetLength = 5, SiteAngle = 6, Density = 7, Energy = 8, Friction = 9, Power = 10, Power_Density = 11, Pressure = 12, Temperature = 13, Velocity = 14, Airflow = 15, DuctSize = 16, CrossSection = 17, HeatGain = 18, Electrical_Current = 19, Electrical_Potential = 20, Electrical_Frequency = 21, Electrical_Illuminance = 22, Electrical_Luminous_Flux = 23, Electrical_Power = 24, Roughness = 25, Force = 26, LinearForce = 27, AreaForce = 28, Moment = 29, ForceScale = 30, LinearForceScale = 31, AreaForceScale = 32, MomentScale = 33, Electrical_Apparent_Power = 34, Electrical_Power_Density = 35, Piping_Density = 36, Piping_Flow = 37, Piping_Friction = 38, Piping_Pressure = 39, Piping_Temperature = 40, Piping_Velocity = 41, Piping_Viscosity = 42, PipeSize = 43, Piping_Roughness = 44, Stress = 45, UnitWeight = 46, ThermalExpansion = 47, LinearMoment = 48, LinearMomentScale = 49, ForcePerLength = 50, ForceLengthPerAngle = 51, LinearForcePerLength = 52, LinearForceLengthPerAngle = 53, AreaForcePerLength = 54, Piping_Volume = 55, Viscosity = 56, CoefficientOfHeatTransfer = 57, Airflow_Density = 58, Slope = 59, Cooling_Load = 60, Cooling_Load_Divided_By_Area = 61, Cooling_Load_Divided_By_Volume = 62, Heating_Load = 63, Heating_Load_Divided_By_Area = 64, Heating_Load_Divided_By_Volume = 65, Airflow_Divided_By_Volume = 66, Airflow_Divided_By_Cooling_Load = 67, Area_Divided_By_Cooling_Load = 68, WireSize = 69, Piping_Slope = 71, Currency = 72, Electrical_Efficacy = 73, Electrical_Wattage = 74, Color_Temperature = 75, DecSheetLength = 76, Electrical_Luminous_Intensity = 77, Electrical_Luminance = 78, Area_Divided_By_Heating_Load = 79, Factor = 80, Electrical_Temperature = 81, Electrical_CableTraySize = 82, Electrical_ConduitSize = 83, Reinforcement_Volume = 84, Reinforcement_Length = 85, Electrical_Demand_Factor = 86, DuctInsulationThickness = 87, DuctLiningThickness = 88, PipeInsulationThickness = 89, ThermalResistance = 90, ThermalMass = 91, Acceleration = 92, Bar_Diameter = 93, Crack_Width = 94, Displacement_Deflection = 95, Structural_Frequency = 97, Mass = 98, Mass_per_Unit_Length = 99, Moment_of_Inertia = 100, Surface_Area = 101, Period = 102, Pulsation = 103, Reinforcement_Area = 104, Reinforcement_Area_per_Unit_Length = 105, Reinforcement_Cover = 106, Reinforcement_Spacing = 107, Rotation = 108, Section_Area = 109, Section_Dimension = 110, Section_Modulus = 111, Section_Property = 112, Structural_Velocity = 113, Warping_Constant = 114, Weight = 115, Weight_per_Unit_Length = 116, ThermalConductivity = 117, SpecificHeat = 118, SpecificHeatOfVaporization = 119, Permeability = 120, Electrical_Resistivity = 121, MassDensity = 122, MassPerUnitArea = 123, Pipe_Dimension = 124, PipeMass = 125, PipeMassPerUnitLength = 126, TemperatureDifference = 127, Piping_TemperatureDifference = 128, Electrical_TemperatureDifference = 129, TimeInterval = 130, Speed = 131, [Obsolete("Use with care, not available in 2020")] Stationing = 132, [Obsolete("Use with care, not available in 2020, 2021")] AngularSpeed = 133, [Obsolete("Use with care, not available in 2020, 2021")] CostPerArea = 134, [Obsolete("Use with care, not available in 2020, 2021")] CostRateEnergy = 135, [Obsolete("Use with care, not available in 2020, 2021")] CostRatePower = 136, [Obsolete("Use with care, not available in 2020, 2021")] Diffusivity = 137, [Obsolete("Use with care, not available in 2020, 2021")] Distance = 138, [Obsolete("Use with care, not available in 2020, 2021")] FlowPerPower = 139, [Obsolete("Use with care, not available in 2020, 2021")] HeatCapacityPerArea = 140, [Obsolete("Use with care, not available in 2020, 2021")] HvacMassPerTime = 141, [Obsolete("Use with care, not available in 2020, 2021")] Image = 142, [Obsolete("Use with care, not available in 2020, 2021")] Integer = 143, [Obsolete("Use with care, not available in 2020, 2021")] IsothermalMoistureCapacity = 144, [Obsolete("Use with care, not available in 2020, 2021")] LoadClassification = 145, [Obsolete("Use with care, not available in 2020, 2021")] Material = 146, [Obsolete("Use with care, not available in 2020, 2021")] MultilineText = 147, [Obsolete("Use with care, not available in 2020, 2021")] NumberOfPoles = 148, [Obsolete("Use with care, not available in 2020, 2021")] PipingMassPerTime = 149, [Obsolete("Use with care, not available in 2020, 2021")] PowerPerFlow = 150, [Obsolete("Use with care, not available in 2020, 2021")] PowerPerLength = 151, [Obsolete("Use with care, not available in 2020, 2021")] RotationAngle = 152, [Obsolete("Use with care, not available in 2020, 2021")] StationingInterval = 153, [Obsolete("Use with care, not available in 2020, 2021")] Text = 154, [Obsolete("Use with care, not available in 2020, 2021")] ThermalGradientCoefficientForMoistureCapacity = 155, [Obsolete("Use with care, not available in 2020, 2021")] Url = 156, [Obsolete("Use with care, not available in 2020, 2021")] WireDiameter = 157, [Obsolete("Use with care, not available in 2020, 2021")] YesNo = 158, [Obsolete("Use with care, not available in 2020, 2021, 2022")] ApparentPowerDensity = 159, [Obsolete("Use with care, not available in 2020, 2021, 2022")] FillPattern = 160, #pragma warning restore 1591 }
根本原因
该问题和枚举定义本身无关,是运行时加载的AdaptedType是旧版本编译产物,没有包含后续新增的成员:
- 标记
[Obsolete]特性的成员不会被Enum.GetValues忽略,该特性仅在编译阶段产生警告提示,不影响运行时反射结果 - 枚举默认底层类型为
int,取值范围完全覆盖-2到160的区间,不存在数值溢出导致的成员丢失 - 枚举成员的数值跳号(如跳过70、96两个值)也不会影响长度统计,只要成员在定义中存在就会被计入
- 统计返回值恰好为134,刚好对应枚举中
AngularSpeed = 133及之前的成员总数,说明运行时加载的是新增CostPerArea及后续成员之前的旧版本程序集。
常见触发场景
- 多项目解决方案中,修改了枚举所在的公共项目后,单元测试项目没有触发重新编译,输出目录残留旧版本DLL
- 单元测试项目引用的是枚举所在项目的本地DLL文件而非项目引用,修改枚举源码后没有替换引用的旧DLL
- 测试运行器存在缓存,执行测试时没有加载最新的编译结果
- 存在类型命名冲突:当前编辑的
AdaptedType和运行时加载的AdaptedType属于不同命名空间,后者恰好只有134个成员 - 枚举所在类库以NuGet包形式被引用,修改源码后没有重新打包、更新NuGet引用,程序加载的是NuGet缓存中的旧版本。
排查方案
- 在调用
Enum.GetValues的代码前添加Console.WriteLine(typeof(AdaptedType).Assembly.Location);,查看运行时实际加载的程序集路径,确认该文件的修改时间为最新编译时间 - 执行「清理解决方案」操作,手动删除所有项目的
bin、obj文件夹后重新生成整个解决方案,再运行测试 - 检查解决方案中是否存在其他同名的
AdaptedType定义,确认调用代码引用的是当前修改的枚举所在的命名空间 - 如果是NuGet引用,清空本地NuGet缓存,重新打包引用最新版本的类库。
内容的提问来源于stack exchange,提问作者Quest
相关产品推荐
相关产品推荐

