C#sizeof(枚举)替代? (解决方法resharper false error)?

在C#中,我有一些与UAC提升相关的“安全”API代码。 它涉及获取枚举的大小(如下)

int myEnumSize = sizeof (MyEnum); 

代码本身是有效的,编译,正常工作等。但Resharper在解决方案中错误地将其标记为错误(“不能在安全上下文中使用不安全的构造”)。 ( 从C#2.0版开始,将sizeof应用于内置类型不再需要使用不安全模式。 )我喜欢Resharper,我喜欢解决方案分析,但是在解决方案中使用此代码我有一个很大的红点让我觉得有些东西被打破的角落。 如果我告诉resharper忽略这个错误,它会在几分钟内回来。

我会提出JetBrains的问题,但我看了他们的跟踪器,他们已经有一个记录,自3月以来一直被忽略。 进一步观察他们至少还有两个这样的记录事件可以追溯到几年前,两者都被解雇,并且处于“无重复”状态。 我不想只是为了对这个错误进行投票而注册他们的跟踪器。 我可能最终屏住呼吸多年了。 最快的方法就是解决这个问题。

什么是最好的替代方案,仍然是正确的,并且最小的机会导致维护者以后遇到麻烦?

我可以硬编码:

 int myEnumSize = 4; 

有更正确的解决方案吗? – 哪个不使用sizeof(枚举)?

BTW:

  Marshal.SizeOf() 

是完全“安全”但返回错误的大小。

PS。 问题中的代码很大程度上受到Microsoft的UACSelfElvation演示代码的影响。 如果您想了解更多细节。 但我不认为它们是相关的。

看起来很难看,但可能有效:

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

由John Gietzen编辑:
certificate:

 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

Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum1))):1
Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum2))):2
Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum3))):4
Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum4))):8
Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum5))):1
Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum6))):2
Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum7))):4
Marshal.SizeOf(Enum.GetUnderlyingType(typeof(Enum8))):8

正确的解决方案是在此行之前添加注释,说明该工具生成的警告不正确。 这将防止未来的维护者变得困惑,并试图修复一些没有破坏的东西。

我想(如果你真的,真的想)你可以在枚举上使用开关/案例。 但我的猜测是尺寸是有原因的。

如果您对获取枚举的基础数据对象的大小感兴趣,可能更好的方法是首先获取System.Type对象。

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

您可以在ReSharper中忽略它,但这有点痛苦并且妥协/改变您的设计。 您可以使用Enum定义和方法在其自己的文件中获取类中的大小(使用sizeof),然后单击ReSharper> Options …> Code Inspection> Settings> Edit Items to Skip,然后选择该文件(I使用R#5.1)。

显然你不会得到代码分析,但你仍然可以清除代码格式。