質問
C#列挙型はタイプセーフですか?
そうでない場合、どのような影響がありますか?
解決
わずかに異なる答えを与えるために...値はキャストの観点からタイプセーフですが、キャストされると未チェックのままです-つまり
enum Foo { A = 1, B = 2, C = 3 }
static void Main()
{
Foo foo = (Foo)500; // works fine
Console.WriteLine(foo); // also fine - shows 500
}
このため、値をチェックするように注意する必要があります。たとえば、例外をスローする switch
の default
を使用してください。
次の方法でも( [Flags]
以外の値について)確認できます:
bool isValid = Enum.IsDefined(typeof(Foo), foo);
他のヒント
はい、そうです。
以下は、 http://www.csharp-station.com/Tutorialsからのものです。 /Lesson17.aspx
列挙型は、厳密に型指定された定数です。これらは、シンボリック名を整数値に割り当てることができる本質的にユニークなタイプです。 C#の伝統では、これらは強く型付けされています。つまり、メンバーの基になる値が同じであっても、ある型の列挙型を別の型の列挙型に暗黙的に割り当てることはできません。同じ行に沿って、整数型と列挙型は暗黙的に交換できません。異なる列挙型と整数型の間のすべての割り当てには、明示的なキャストが必要です。
Enum.IsDefinedを使用して引数の検証を行うことを提案している人には...しないでください! Per Brad Abrams( Enum Designのフレームワーク設計ガイドライン更新):
Enum.IsDefined()には実際に2つの問題があります。最初に、リフレクションと一連のコールド型メタデータをロードし、一見高価な呼び出しにします。第二に、メモが暗示するように、ここにはバージョン管理の問題があります。
はい。
列挙型は、厳密に型指定された定数です。 それらは本質的にユニークなタイプです シンボリック名を割り当てることができます 整数値。 C#の伝統では、 彼らは強く型付けされている、つまり 1つのタイプの列挙型は の列挙に暗黙的に割り当てられます にもかかわらず別のタイプ メンバーの基本的な価値は 同じ。同じ線に沿って、 整数型と列挙型は 暗黙的に交換可能。すべて 異なる列挙間の割り当て 型と整数型には 明示的なキャスト。
はい。
C#:列挙型:
-名前付き値の型保証された列挙。
-プログラミングエラーの防止
-ユーザーは基になる型を制御できます(デフォルトはint)
-基になる値も制御できます
技術的にいいえただし、指定された名前の列挙のみを使用するようにすると、参照を更新せずに列挙値の名前を変更すると、コンパイル時エラーが発生します。この点に関しては、タイプセーフです。
ここでパーティーに遅れましたが、少し余分なものを捨てたいと思いました... Krzysztof Cwalinaの.NET Framework設計ガイドライン。有効な値がEnumsに渡されることを確認するための上記の優れたヒントに加えて、これはそれらを効果的に使用するためのその他のガイダンスとアドバイスを提供します。など
はいr強く型付けされたsafed u enum定数変数の整数値u hv 2への暗黙の変換はできません。expatcitlydo dat 例えば enum days { 太陽、 月 } int e =(int)days.sun; console.writeline(e);