为什么访问枚举定义中不存在的枚举成员(通过转换整数)不会出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么访问枚举定义中不存在的枚举成员(通过转换整数)不会出错相关的知识,希望对你有一定的参考价值。

要修复我的应用程序中的错误,我必须设置System.Net程序集中找到的ServicePointManager类的SecurityProtocolType,如下所示:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

在.Net 4.5+中,SecurityProtocolType枚举有四个成员:

public enum SecurityProtocolType
{
    Ssl3 48,    
    Tls 192,    
    Tls11 768,  
    Tls12 3072
}

但是,在.Net 4.0中,SecurityProtocolType枚举只有两个成员:

public enum SecurityProtocolType
{
    Ssl3 48,    
    Tls 192
}

因为,我的代码中的另一个项目也需要相同的修复,但该项目是在.Net 4.0上没有Tls12作为枚举的成员,this回答提出了以下解决方法(前提是我安装了.Net 4.5)框):

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

可能是我错过了明显的smoething,但我的问题是,当3072不是.Net 4.0中enum的有效值时,(SecurityProtocolType)3072如何解析为Tls12。我想了解幕后工作的魔力是什么。

答案

从C#中的枚举文档(MSDN

可以在基础类型的范围内为类型为Day的变量分配任何值;值不限于命名常量。

因此代码肯定没有问题编译。此外:

与任何常量一样,对枚举的各个值的所有引用在编译时都将转换为数字文字。这可能会产生潜在的版本控制问题,如常量中所述。

为新版本的枚举分配其他值,或在新版本中更改枚举成员的值可能会导致依赖源代码出现问题。

你实际上正在利用这一点。在.NET 4.0上运行时,框架不知道如何处理3072值,但.NET 4.5框架可以。您只是没有方便的快捷方式(枚举)来获取该值。

另一答案

安装.NET 4.5后,您的4.0应用程序将使用4.5 System.dll,而4.5 System.dll将具有Tls12 Enum成员。

以上是关于为什么访问枚举定义中不存在的枚举成员(通过转换整数)不会出错的主要内容,如果未能解决你的问题,请参考以下文章

c#中怎样定义枚举?

python之枚举类型

c语言枚举类型enum用法

C语言基础:enum 枚举类型(定义遍历枚举元素枚举在 switch 中的使用将整数转换为枚举)

Python枚举的定义和使用(enum)

enum class 和 enum比较