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.I
、E
が単一の識別子である場合、 の意味E
はシンプル名(§12.8.4)は、定数、フィールド、プロパティ、ローカル変数、またはパラメータでありE
、タイプ名(§7.8.1) の場合、 の両方の意味がE
許可されます。 のメンバー検索は、両方のケースでが必ず型のメンバーであるE.I
ため、決して曖昧にはなりません。言い換えると、このルールは、コンパイル時エラーが発生する可能性のある の静的メンバーとネストされた型へのアクセスを単に許可するだけです。I
E
E
あなたの場合、AはControlType.Foo
を検索しControlType
、それがプロパティであることを見つけます同じタイプE
( )としてControlType
、両方のメンバーをFoo
型の静的メンバーとして参照できます。そしてメンバーとして(ControlType
プロパティに効果的にアクセスすることにより)。
あなたの場合、BはControlType.Foo
を検索しControlType
、それがプロパティであることを見つけます異なるタイプのE
(今回です)ControlType?
メンバー検索が続行されますのみのメンバーとControlType?
。