为什么访问枚举定义中不存在的Enum成员(通过强制转换整数)不会产生错误

时间:2018-10-24 19:45:40

标签: c# .net enums

要修复我的应用程序中的错误,我必须像这样在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;

可能我缺少明显的平滑处理,但是我的问题是,当3072不是.Net 4.0中枚举的有效值时,(SecurityProtocolType)3072如何解析为Tls12。我想了解使这项工作在幕后发生的魔力。

1 个答案:

答案 0 :(得分:9)

摘自C#(MSDN)枚举文档

  

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

因此,代码当然没有编译问题。另外:

  

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

     

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

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