ここで質問されていることは、私には完全に明確ではありませんでしたが、今は理解できたと思います.
以下のコードを考えると:
void F(Object obj) {
var isEnum obj is Enum;
...
}
C# 標準のどの部分で、インスタンスが列挙型の場合にisEnum
trueであると指定されていますか?obj
C# 言語仕様の14.9.10 is operatorには、評価方法を説明する 5 つの箇条書きがあります。
obj
1 番目の箇条書きは、より具体的な型を持つケースについてです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 は同じ型ではありませMyEnum
んSystem.Enum
。
R はMyEnum
値型 (11.1.9) であり、参照型ではありません。
T はSystem.Enum
インターフェイス タイプではありません。
仕様に誤りがあると主張したくはありませんが、14.9.10 を詳細に読んだ後、is Enum
enum 型へのボックス化された参照がどのように true に評価されるのかわかりません。
一般的に標準化の人々は私よりもはるかに賢いことを知っているので、おそらく何かを見落としていますが、私が見落としていなくてもis Enum
、型が列挙型であるかどうかをテストするために使用することを止めるべきではありません。このように使用できる実装の詳細ではないと確信しています。