フィールドが列挙型と同じ名前になっている場合は列挙値を参照できるのに、フィールド型が null 許容になっている場合は参照できないのはなぜですか? 質問する

フィールドが列挙型と同じ名前になっている場合は列挙値を参照できるのに、フィールド型が null 許容になっている場合は参照できないのはなぜですか? 質問する

A動作するのにBコンパイルに失敗するのはなぜですか?

それはバグですか? そうでない場合、この異なる動作はどこで説明/指定されていますか?

enum ControlType { Foo }

class A
{
    public ControlType ControlType = ControlType.Foo;
}

class B
{
    public ControlType? ControlType = ControlType.Foo; // <-- error CS0236: A field initializer cannot reference the non-static field, method, or property 'B.ControlType'
}

ベストアンサー1

違いは、状況が最終的に要件を満たすかどうかです。C#仕様のセクション12.8.7.2- 「単純名と型名が同一」

形式のメンバーアクセスにおいてE.IEが単一の識別子である場合、 の意味Eシンプル名(§12.8.4)は、定数、フィールド、プロパティ、ローカル変数、またはパラメータでありEタイプ名(§7.8.1) の場合、 の両方の意味がE許可されます。 のメンバー検索は、両方のケースでが必ず型のメンバーであるE.Iため、決して曖昧にはなりません。言い換えると、このルールは、コンパイル時エラーが発生する可能性のある の静的メンバーとネストされた型へのアクセスを単に許可するだけです。IEE

あなたの場合、AはControlType.Fooを検索しControlType、それがプロパティであることを見つけます同じタイプE( )としてControlType、両方のメンバーをFoo型の静的メンバーとして参照できます。そしてメンバーとして(ControlTypeプロパティに効果的にアクセスすることにより)。

あなたの場合、BはControlType.Fooを検索しControlType、それがプロパティであることを見つけます異なるタイプのE(今回です)ControlType?メンバー検索が続行されますのみのメンバーとControlType?

おすすめ記事