Строго говоря, я думаю, что это ошибка в подробности реализации времени выполнения, поскольку спецификация C # говорит:
Распаковка в тип NULLнулевое значение типа nullable-типа, если исходный операнд имеет значение null, или завернутый результат распаковки экземпляра объекта в базовый тип типа nullable-типа в противном случае.
То есть, если распаковывать вStringComparison работает, тогда распаковка на Nullable тоже должна работать.Немного неясно, должны ли оба работать или оба должны потерпеть неудачу.В спецификации сказано, что
Чтобы преобразование в распакованном виде в заданный тип с ненулевым значением было успешным во время выполнения, значение исходного операнда должно быть ссылкой на упакованное значение этогоnon-nullable-value-type.
Вы должны решить, считается ли упакованное целое int упакованным значением типа StringComparison, потому что базовый тип StringComparison - int.Далее в спецификации говорится, что InvalidCastException генерируется, если в поле содержится «несовместимый объект».Int, безусловно, «совместим» со StringComparison, поскольку вы можете безопасно скопировать четыре байта из кучи в переменную StringComparison.