2

次のように ushort から継承する列挙型を宣言すると:

public enum MyEnum : ushort { A = 0, B = 1 };

次に、次のようにそのタイプを確認します。

if(typeof(MyEnum) != typeof(ushort))
            System.Diagnostics.Debugger.Break();

ブレークポイントが呼び出されます。なぜこうなった?

4

1 に答える 1

8

同じタイプではないので呼ばれています!1つはtypeの基になる値を持つ列挙型であり、もう1つushortushortそれ自体です。(同じ構文を使用していても、実際には「継承ushort」ではないことに注意してください。実際には、「基になる型は」とだけ言っていますushort。)

なぜそれらが同じタイプであると期待するのですか?それらが実際に同じ型である場合、列挙型の型安全性の多くを失うことになります。

typeof(MyEnum).Name印刷してUInt16IMOを取得するのは非常に奇妙です。

基になるタイプを判別しようとしている場合は、以下を使用する必要があります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そのような比較を本当に行いたい状況を調べたいと思うかもしれません。

于 2012-07-30T21:09:55.910 に答える