Dan*_*anO 6 c# resharper interop sizeof
在C#中,我有一些与UAC提升相关的"安全"API代码.它涉及获取枚举的大小(如下)
int myEnumSize = sizeof (MyEnum);
Run Code Online (Sandbox Code Playgroud)
代码本身是有效的,编译,正常工作等.但Resharper在解决方案中错误地将其标记为错误("不能在安全上下文中使用不安全的构造").(从C#2.0版开始,将sizeof应用于内置类型不再需要使用不安全模式.)我喜欢Resharper,我喜欢解决方案分析,但是在解决方案中使用此代码我有一个大红点让我觉得有些东西被打破的角落.如果我告诉resharper忽略这个错误,它会在几分钟内回来.
我会向JetBrains提出这个问题,但我看了他们的跟踪器,他们已经有一个记录,自3月以来一直被忽略.进一步观察他们至少还有两次这种记录的事件可以追溯到几年前,两者都以"无重复"状态被驳回.我不想注册他们的跟踪器只是为了对这个错误进行投票.我可能最终屏住呼吸多年了.最快的方法就是解决这个问题.
什么是最好的替代方案,仍然是正确的,并且最不可能在以后造成维护者的任何麻烦?
我可以硬编码:
int myEnumSize = 4;
Run Code Online (Sandbox Code Playgroud)
有更正确的解决方案吗? - 哪个不使用sizeof(枚举)?
BTW:
Marshal.SizeOf()
Run Code Online (Sandbox Code Playgroud)
是完全"安全"但返回错误的大小.
PS.问题中的代码很大程度上受到Microsoft 的UACSelfElvation演示代码的影响.如果您想了解更多细节.但我不认为它们是相关的.
看起来很丑,但可能有用:
int myEnumSize = Marshal.SizeOf(Enum.GetUnderlyingType(typeof(MyEnum)));
Run Code Online (Sandbox Code Playgroud)
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 }
Run Code Online (Sandbox Code Playgroud)
sizeof(Enum1):1
sizeof(Enum2):2
sizeof(Enum3):4
sizeof(Enum4):8
sizeof(Enum5):1
sizeof(Enum6):2
sizeof(Enum7):4
sizeof(Enum8):8Marshal.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
| 归档时间: |
|
| 查看次数: |
5501 次 |
| 最近记录: |