2010-11-18 5 views
6

C#では、UACの高度に関する「安全な」APIコードがいくつか用意されています。これは、(「安全な文脈で危険な構文を使用できません」というエラーとして(次のように)しかし、ReSharperの虚偽のフラグになど、コード自体は、有効でコンパイルし、正常に動作することをC#sizeof(enum)の代わりに? (虚偽のエラーを再共有するための回避策)?

int myEnumSize = sizeof (MyEnum); 

を列挙型のサイズを取得する必要)を解決します。 (Starting with version 2.0 of C#, applying sizeof to built-in types no longer requires that unsafe mode be used.)私はResharperが大好きで、私は解決策分析が大好きですが、このコードで解決策を見つけました。私はいつも何かが壊れていると思うように、大きな赤い点がコーナーにあります。 resharperにこのエラーを無視するように指示すると、数分で復帰します。

私はJetBrainsの問題を提起しますが、私は彼らのトラッカーを見て、すでに3月以降無視されているログを取得しました。彼らはさらに、少なくとも2つの別のインスタンスがログに記録されていることを確認するために、数年後には、 "repro"状態で解雇されました。私は自分のトラッカーにサインアップしてこのバグに投票するだけではいけません。私はまだ何年もの間息を止めてしまうことができます。最速の方法は、問題を回避することです。

メンテナが後で何かトラブルを起こす可能性が最も低い正しい選択肢は何ですか?

私はにハードコードもできます。より正確な解決策がある

int myEnumSize = 4; 

ですか? - sizeof(enum)を使わないのですか?ところで

Marshal.SizeOf() 

は完全に "安全" であるが、間違ったサイズを返します。

PS。質問のコードは、MicrosoftのUACSelfElvationデモコードの影響を大きく受けます。詳細が必要な場合。しかし、私はそれらが適切であるとは思わない。

答えて

6

は醜い見えるが、動作する可能性があり:ジョン・Gietzenによって

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


編集:
証明:

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(タイプ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

+1

作業が確認されました。 –

+1

パーフェクト。これはまさに私が探していたものです。それはうまくいきませんが、より簡潔な方法を示し、ここでそれが使われなかった理由を示すコメントがあれば、それはうまくいくでしょう。ありがとうございました。これはまさに私がStackoverflowを尋ねるときに望んでいたものです。 – DanO

1

正しい解決策は、この行の前に、ツールによって生成された警告が正しくないことを示すコメントを追加することです。これにより、将来のメンテナが混乱したり、壊れていないものを修正しようとするのを防ぐことができます。

+0

これはどのようにして彼の問題を解決しますか? –

+0

Resharperのバグを修正するのに手間がかからない、実際には解決策はありません、ありますか? – cdhowie

+0

いいえ、修正はありません。しかし、回避策?多分。それが彼が求めていることです。 –

0

想像してみてください(あなたが本当に欲しいのであれば)あなたは列挙でスイッチ/ケースを使うことができます。しかし、私の推測では、そこにはサイズの理由があります。

0

列挙型の基礎となるデータオブジェクトのサイズを取得することに興味があるなら、おそらくもっと良い方法はSystem.Typeオブジェクトを最初に保持することです。

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

あなたはReSharperの中でそれを無視することができますが、それは痛みと妥協のビットは/あなたのデザインを変更します。列挙型の定義と、そのファイル内のクラスのサイズを取得する(sizeofを使用)メソッドを配置し、ReSharper>オプション...>コード検査>設定>スキップするアイテムの編集をクリックして、そのファイルを選択することができますRは#5.1を使用しています)。

明らかにコード解析は行われませんが、コードフォーマットのクリーニングは引き続き行われます。

関連する問題