Почему доступ к члену Enum, отсутствующему в определении enum (посредством приведения целого числа), не приводит к ошибке - PullRequest
0 голосов
/ 24 октября 2018

Чтобы исправить ошибку в моем приложении, мне пришлось установить SecurityProtocolType класса ServicePointManager, найденного в сборке System.Net, следующим образом:

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, этот ответ предложил следующий обходной путь (при условии, что .Net 4.5 установлен на том же компьютере):

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

Может быть, мне не хватает очевидного сглаживания, но мой вопрос в том, как (SecurityProtocolType)3072 разрешается в Tls12, когда 3072 не является допустимым значением для перечисления в .Net 4.0.Я хочу понять, какая магия происходит за кулисами, которая заставляет эту работу.

1 Ответ

0 голосов
/ 24 октября 2018

Из документации по перечислениям в C # ( MSDN )

Переменной типа Day может быть присвоено любое значение в диапазоне базового типа;значения не ограничены именованными константами.

Таким образом, код, безусловно, не имеет проблем с компиляцией.Кроме того:

Как и с любой константой, все ссылки на отдельные значения перечисления преобразуются в числовые литералы во время компиляции.Это может создать потенциальные проблемы управления версиями, как описано в разделе Константы.

Присвоение дополнительных значений новым версиям перечислений или изменение значений членов перечисления в новой версии может вызвать проблемы для зависимого исходного кода.

Вы фактически пользуетесь этим.При работе в .NET 4.0 фреймворк не знает, что делать со значением 3072, но фреймворк .NET 4.5 знает.У вас просто нет удобного ярлыка (перечисления), чтобы получить это значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...