枚举解析中的困惑我是将一个字符串类型的值转换成对应的枚举。当我测试我的代码时,我发现有趣的行为让我感到困惑。使用下面的代码示例,如果/当“s”变量的值与其中一个枚举值不匹配时,有人可以阐明为什么不抛出异常吗?另外,如何将sEnumvar设置为Stooge枚举定义中不存在的值?类程序{enumStooge{Unspecified,Moe,Larry,Curly,Shemp}staticvoidMain(string[]args){while(true){控制台。WriteLine("请输入数字...");字符串s=控制台。读线();StoogesEnum=(Stooge)(int.Parse(s));//如果s!=0、1、2、3或4,为什么这一行不抛出异常?Console.WriteLine("rn你输入了:{0}rnEnum字符串值:{1}rnEnumInt值:{2}rn",s,sEnum.ToString(),(int)sEnum);}}}这是创建.NET的人的决定。枚举由另一种值类型(int、short、byte等)支持,因此它几乎可以具有对这些值类型有效的任何值。我个人并不喜欢它的工作方式,因此我制作了一系列实用方法://////枚举值的实用方法。如果///您尝试提供不是枚举的值,则此静态类型将无法初始化///(抛出)。//////枚举类型。publicstaticclassEnumUtilwhereT:struct,IConvertible//尽可能多地进行静态检查。{//.NET框架不提供编译检查//方法来确保类型是枚举,因此我们必须检查类型//何时被静态调用。staticEnumUtil(){//如果给定类型不是枚举,则在静态初始化时抛出异常。Require.That(typeof(T).IsEnum,()=>typeof(T).FullName+"不是枚举类型。");}//////在.NETFramework中,对象可以转换为枚举值,这些值不是///为其类型定义的。此方法提供了一个简单的快速失败检查///枚举值已定义,并同时创建一个强制转换。///将给定值转换为给定枚举类型。///抛出异常如果没有为给定的枚举类型定义值,则选项。///////////////如果给定值不是枚举类型的定义值。//////publicstaticTDefinedCast(objectenumValue){if(!System.Enum.IsDefined(typeof(T),enumValue))thrownewInvalidCastException(enumValue+“不是枚举类型的定义值”+typeof(T).全名;返回(T)枚举值;}///////////////publicstaticTParse(stringenumValue){varparsedValue=(T)System.Enum.Parse(typeof(T),enumValue);//要求定义解析值Require.That(parsedValue.IsDefined(),()=>newArgumentException(string.Format("{0}isnotadefinedvalueforenumtype{1}",enumValue,typeof(T).全名)));返回解析值;}publicstaticboolIsDefined(TenumValue){returnSystem.Enum.IsDefined(typeof(T),enumValue);}}publicstaticclassEnumExtensions{publicstaticboolIsDefined(thisTenumValue)whereT:struct,IConvertible{returnEnumUtil.IsDefined(enumValue);这样,我可以说:if(!sEnum.IsDefined())thrownewException(...);...或:EnumUtil.Parse(s);//如果s不是定义的值,则抛出异常。枚举在技术上只是一个int(或者您已经定义了枚举的基础类型)您可以检查枚举中的相应值,但调用Enum.IsDefined。更多信息:ConvertinganinttoanenuminC#Enumsarereallythinonints。基本上就是int+可能值(常量)的静态集合。所有检查都在编译时进行,类型检查等。但是当您实际将int作为枚举运行时,它并不关心。所以请验证您的输入!如果在传递的值不可解析的情况下抛出异常,请使用int.Parse()。如果你想在不抛出异常的情况下解析可能无效的值,请使用int.TryParse()。以上就是《C#学习教程:解析枚举共享的困惑》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
