次のように ushort から継承する列挙型を宣言すると:
public enum MyEnum : ushort { A = 0, B = 1 };
次に、次のようにそのタイプを確認します。
if(typeof(MyEnum) != typeof(ushort))
System.Diagnostics.Debugger.Break();
ブレークポイントが呼び出されます。なぜこうなった?
同じタイプではないので呼ばれています!1つはtypeの基になる値を持つ列挙型であり、もう1つushort
はushort
それ自体です。(同じ構文を使用していても、実際には「継承ushort
」ではないことに注意してください。実際には、「基になる型は」とだけ言っていますushort
。)
なぜそれらが同じタイプであると期待するのですか?それらが実際に同じ型である場合、列挙型の型安全性の多くを失うことになります。
typeof(MyEnum).Name
印刷してUInt16
IMOを取得するのは非常に奇妙です。
基になるタイプを判別しようとしている場合は、以下を使用する必要がありますType.GetEnumUnderlyingType
。
if (typeof(MyEnum).GetEnumUnderlyingType() == typeof(ushort))
{
// Yup, the underlying type is ushort
}
編集:完全を期すために、もしMyEnum
本当にから継承したのushort
なら、あなたはまだ型の同等性をテストしているでしょう。cdhowieがコメントで言っているように、あなたが書いた場合:
if (typeof(string) != typeof(object))
{
Debugger.Break();
}
それでもデバッガーに侵入します。Type.IsAssignableFrom
そのような比較を本当に行いたい状況を調べたいと思うかもしれません。