2

オブジェクトが Enum であるかどうかis Enumをテストする では、オブジェクトをテストして列挙値が含まれているかどうかを確認する方法について説明しています。

これは仕様のどこかに指定されていますか? (バージョン 4.0 の 7.10.10)のエントリにisは、次の可能な右側の値がリストされています。

  • 無名関数
  • メソッドグループ
  • ヌル
  • 参照型 ** これは列挙型でしょうか?
  • null 許容型
  • null 非許容値型 ** これは列挙型でしょうか?

列挙値が上記のリストの「参照型」と一致すると仮定すると、仕様には次のように記載されています。

...結果は、D [RHS の動的型] と T [LHS] が同じ型である場合、D が参照型であり、D から T への暗黙的な参照変換が存在する場合、または D が値型と D から T へのボックス化変換が存在します。

の場合、これらの条件のいずれかが厳密に真is Enumですか? たとえば、is classまたはのコンパイラ サポートはありませんis struct

仕様によるサポートis Enumですか、それとも実装上の決定ですか?

4

4 に答える 4

1

クラスや構造体を他の型と区別する共通の基本型がないため、 is classorはサポートされていません。すべての列挙型のベースである実際の型であるため、機能します。Andは参照型であるため、最後の部分が適用されます。is structis EnumSystem.EnumEnum

D が値型で、D から T へのボックス変換が存在する場合

D(左側の式の型) は値型です。そしてTEnumの基本型ですDDからへのボックス化変換があるEnumため、式の値は ですtrue

任意の列挙型から へのボクシング変換はEnum、§14.4 The System.Enum 型で明示的に指定されています。

System.Enumはすべての列挙型の抽象基本クラス (これは、列挙型の基になる型とは異なります) であり、継承元のメンバーSystem.Enumは任意の列挙型で使用できます。任意の列挙型から へSystem.Enumのボックス化変換が存在し、任意の列挙型へのボックス化解除変換が存在しSystem.Enumます。

System.Enumそれ自体はenum-typeではないことに注意してください。むしろ、すべての列挙型が派生するクラス型です。typeは typeから継承し、 type は type から継承します。実行時に、 type の値はnull にするか、任意の列挙型のボックス化された値への参照にすることができます。System.EnumSystem.ValueTypeobjectSystem.Enum

于 2012-02-08T13:37:07.333 に答える
0

ここで質問されていることは、私には完全に明確ではありませんでしたが、今は理解できたと思います.


以下のコードを考えると:

void F(Object obj) {
  var isEnum obj is Enum;
  ...
}

C# 標準のどの部分で、インスタンスが列挙型の場合にisEnumtrueであると指定されていますか?obj


C# 言語仕様の14.9.10 is operatorには、評価方法を説明する 5 つの箇条書きがあります。

  • obj1 番目の箇条書きは、より具体的な型を持つケースについてですSystem.Object

  • 2 番目の箇条書きは、null 許容型に関するものです。

  • 4 番目の箇条書きはジェネリック型に関するものです。

  • 5 番目の箇条書きは、一致するものがなく、is演算子が false と評価した場合です。ただし、そうではないことがわかっています。

3 番目の箇条書きが上記のコードに当てはまると思われます。3 番目の箇条書きには 4 つのサブ箇条書きがあります。

  • objが nullの場合、最初のサブブレットが適用されます。

  • 2 番目のサブブレットは、null 許容型に関するものです。

  • 4 番目のサブブレットは、一致するものがなく、is演算子が false と評価する場合ですが、そうではないことがわかっています。

3 番目のサブブレットが適用されると予想されます。

それ以外の場合、R を e によって参照されるインスタンスの実行時の型とします。R と T が同じ型である場合、R が参照型で R から T への暗黙的な参照変換が存在する場合、または R が値型で T が R によって実装されるインターフェイス型である場合、結果は true になります。

ただし、ここで欠落している列挙型に固有の何かがあるようです。objが列挙型のインスタンスであると仮定すると、どのMyEnum句も上記のコードと一致しません。

  • R は で T は であるため、 R と T は同じ型ではありませMyEnumSystem.Enum

  • R はMyEnum値型 (11.1.9) であり、参照型ではありません。

  • T はSystem.Enumインターフェイス タイプではありません。

仕様に誤りがあると主張したくはありませんが、14.9.10 を詳細に読んだ後、is Enumenum 型へのボックス化された参照がどのように true に評価されるのかわかりません。

一般的に標準化の人々は私よりもはるかに賢いことを知っているので、おそらく何かを見落としていますが、私が見落としていなくてもis Enum、型が列挙型であるかどうかをテストするために使用することを止めるべきではありません。このように使用できる実装の詳細ではないと確信しています。

于 2012-02-07T13:40:39.780 に答える
0

Enum は実際の型ですが、class と struct はそうではありません。したがって、Enum は右側で使用できますが、as class と struct は使用できません。

于 2012-02-07T13:41:15.633 に答える
0

Enum参照型です。

typeof(Enum).IsValueType => false

興味深いことに、

typeof(ValueType).IsValueType => false
于 2012-02-07T13:46:38.327 に答える