В C# оператор sizeof(перечисление) альтернатива? (чтобы обойти ошибку resharper false)?

В C# у меня есть "безопасный" код API, связанный с высотой UAC. Он включает в себя получение размера перечисления (следующим образом)

int myEnumSize = sizeof (MyEnum);

сам код действителен, компилируется, работает правильно и т. д. Но Resharper ложно помечает его как ошибку ("не может использовать небезопасную конструкцию в безопасном контексте") в решении. (начиная с версии 2.0 C#, применение sizeof к встроенным типам больше не требует использования небезопасного режима.) Я люблю Resharper, и я люблю анализ решения, но с этим кодом в решении у меня есть большая красная точка в углу, которая заставляет меня всегда думать, что что-то сломано. Если я скажу resharper игнорировать эту ошибку, она вернется в течение нескольких минут.

Я бы поднял проблему с JetBrains, но я посмотрел на их трекер, и у них уже есть один журнал, который игнорируется с марта. Глядя дальше у них по крайней мере двух других случаях это регистрируется несколько лет, оба были уволены с статус "без повтора". Я не хочу подписываться на их трекер только для того, чтобы проголосовать за эту ошибку. Я все еще могу задерживать дыхание на годы. Самый быстрый путь вперед - это просто обойти проблему.

какова лучшая альтернатива, которая по-прежнему правильна и имеет наименьший шанс вызвать у сопровождающего какие-либо проблемы позже?

я мог бы жестко закодировать его:

int myEnumSize = 4;  

есть ли более правильное решение? -- который не использует sizeof(перечисление)?

кстати:

 Marshal.SizeOf() 

полностью "безопасен", но возвращает неправильный размер.

PS. Код в вопросах сильно зависит от UACSelfElvation демонстрационный код от Microsoft. Если вы хотите больше деталей. Но я не думаю, что они актуальны.

5 ответов


выглядит уродливо, но может работать:

int myEnumSize = Marshal.SizeOf(Enum.GetUnderlyingType(typeof(MyEnum)));


Edit by John Gietzen:
Доказательство:
enum Enum1 : sbyte { A, B, C, D }
enum Enum2 : short { A, B, C, D }
enum Enum3 : int { A, B, C, D }
enum Enum4 : long { A, B, C, D }

enum Enum5 : byte { A, B, C, D }
enum Enum6 : ushort { A, B, C, D }
enum Enum7 : uint { A, B, C, D }
enum Enum8 : ulong { A, B, C, D }

sizeof (Enum1): 1
sizeof (Enum2): 2
sizeof (Enum3): 4
sizeof (Enum4): 8
sizeof (Enum5): 1
sizeof (Enum6): 2
sizeof (Enum7): 4
sizeof (Enum8): 8

Маршал.Оператор Sizeof(Тип Enum.GetUnderlyingType(typeof (Enum1))): 1
Маршал.Оператор Sizeof(Тип Enum.GetUnderlyingType(typeof (Enum2))): 2
Маршал.Оператор Sizeof(Тип Enum.GetUnderlyingType(typeof (Enum3))): 4
Маршал.Оператор Sizeof(Тип Enum.GetUnderlyingType(typeof (Enum4))): 8
Маршал.Оператор Sizeof(Тип Enum.GetUnderlyingType(typeof (Enum5))): 1
Маршал.Оператор Sizeof(Тип Enum.GetUnderlyingType(typeof (Enum6))): 2
Маршал.Оператор Sizeof(Тип Enum.GetUnderlyingType(typeof (Enum7))): 4
Маршал.Оператор Sizeof(Тип Enum.GetUnderlyingType(typeof (Enum8))): 8


правильным решением было бы добавить комментарий перед этой строкой, указав, что предупреждение, генерируемое инструментом, неверно. Это предотвратит путаницу будущих сопровождающих и попытки исправить то, что не сломано.


Я полагаю (если вы действительно, действительно хотите), вы можете использовать переключатель / случай в перечислении. Но я думаю, что размер там по причине.


Если вы заинтересованы в получении размера базового объекта данных перечисления,возможно, лучшим способом было бы получить систему.Сначала введите объект.

Type type = typeof (MyEnum);
int enumSize = sizeof (Enum.GetUnderlyingType (type));

вы можете игнорировать его в ReSharper, но это немного больно и компрометирует / изменяет ваш дизайн. Вы можете поместить определение перечисления и метод, чтобы получить размер (используя sizeof) в классе в его собственном файле и нажмите ReSharper > Options... > Проверка кода > настройки > изменить элементы, чтобы пропустить, а затем выберите этот файл (я использую R# 5.1).

очевидно, что вы не получите анализ кода, но вы все равно получите очистку формата кода.