关于如何转换枚举以及如果解析的值超出范围会发生什么,还有一些其他问题,例如:
public enum SomeTypes
{
SomeType1 = 1,
SomeType2 = 2,
SomeType3 = 3
}
public class SomeClass
{
...
var inRange = (SomeTypes) 1;
var outOfRange = (SomeTypes) 5;
...
}
Run Code Online (Sandbox Code Playgroud)
超出范围不会产生任何错误。但是我发现如果您尝试使用超出范围的值序列化-反序列化枚举,您会遇到奇怪的错误。例如,我得到了类似的东西
“错误解析消息或超时”
这让我一直在寻找枚举超出范围之外的其他原因。
处理此问题的建议是通过Enum.IsDefined. 这似乎工作得很好,但是在msdn上有一个相当大胆的警告:
“不要使用 System.Enum.IsDefined(System.Type,System.Object) 进行枚举范围检查,因为它基于枚举的运行时类型,该类型可能会因版本而异。”
所以,我的问题是,我们可以安全地使用Enum.IsDefined或检查枚举的值是否超出范围而不使用Enum.IsDefined?
考虑FileAttributes为按位运算设计的枚举.我创建了一个系统,用户可以在其中选择一些复选框来确定文件的状态.文件可以是ReadOnly和System.因此,该值将是5(1 ReadOnly和4 System).
如何验证整数是否为有效FileAttributes枚举?
我已经看到了这些问题,但它们并没有帮助我,因为它们不适用于bitwised(标记,组合)值.
我有这个枚举:
namespace J.Enums
{
public enum TH
{
Light = 0,
Dark = 1
}
public static partial class Extensions
{
public static string Text(this TH theme)
{
switch (theme)
{
default:
case TH.Light: return "Light";
case TH.Dark: return "Dark";
}
}
public static TH ToTheme(this string theme)
{
switch (theme)
{
default:
case "Light": return TH.Light;
case "Dark": return TH.Dark;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我有一个变量a,如下所示:
var a = 88;
Run Code Online (Sandbox Code Playgroud)
如何确定a的值是否为Enum的有效值?在这种情况下,不会。