Enum.IsDefined<TEnum>泛型方法的作用及疑问:是否会返回false?
关于Enum.IsDefined泛型重载的疑问
我一直使用Enum.IsDefined(Type enumType, object value)这个重载,运行效果良好,但在Enum.cs中发现还有如下泛型重载:
public static bool IsDefined<TEnum>(TEnum value) where TEnum : struct, Enum { RuntimeType enumType = (RuntimeType)typeof(TEnum); ulong[] ulValues = Enum.InternalGetValues(enumType); ulong ulValue = Enum.ToUInt64(value); return Array.BinarySearch(ulValues, ulValue) >= 0; }
来源:Enum.cs
我有以下疑问:
- 该方法是否有可能返回false?
- 在我看来这像是一个bug,它应该接收Enum类型参数而非
TEnum? - 还是我完全误解了它的用途?我原本预期它只是另一重载的语法糖,功能保持一致。
解答
- 该方法确实会返回false
当传入的枚举值对应的数值不在当前枚举类型的预定义成员集合中时,就会返回false。比如定义如下枚举:
public enum Status { Enabled = 1, Disabled = 2 }
执行Enum.IsDefined((Status)3),这个泛型方法会返回false,因为3并不是Status枚举预定义的数值。
这不是bug,泛型约束已经确保类型安全
方法的泛型约束where TEnum : struct, Enum已经限定了TEnum必须是枚举类型,不需要额外接收Enum类型参数。这个设计的核心是避免装箱操作,相比非泛型重载(需要将枚举值装箱为object),泛型版本的性能更优。它不是语法糖,但功能和非泛型重载完全一致
这个泛型重载的逻辑和非泛型版本本质相同:都是验证传入值对应的数值是否属于枚举的预定义成员集合。比如调用Enum.IsDefined(typeof(Status), (Status)3)也会返回false,和泛型重载结果一致。它的存在是为了提供类型安全且高性能的枚举值校验方式。
内容的提问来源于stack exchange,提问作者Ashijo
相关产品推荐
相关产品推荐

