2

行内の非表示のインスタンス変数aにアクセスできないのはなぜですか(int gimmeValue = shinyNewBObject.a;)?baseキーワードを使用してインスタンスにアクセスできることを理解しています。ただし、コンパイラは、shinyNewBObjectのオブジェクト参照を使用して静的変数を除外すると思いました。静的バージョンのaが除外されると、インスタンスバージョンのaが非表示になり、アクセスできるようになります。

何が起きてる?コンパイラーは、アセンブリ内のすべてのIDのリストを作成し、インスタンス変数が静的であるために他のIDを除外する前に非表示になっているため、インスタンス変数を除外しましたか?

class A
{
    public int a;
}

class B : A
{
    new public static int a;

    public void m()
    {
        B shinyNewBObject = new B();
        int gimmeValue = shinyNewBObject.a; //Error
        gimmeValue = base.a;
    }
}
4

2 に答える 2

4

C#仕様のどの部分が、サブクラスの静的フィールドによって隠されているときに基本型変数にアクセスできない理由を示しているのか完全にはわかりませんが、回避するには、次のようにキャストできますA

int gimmeValue = ((A)shinyNewBObject).a; 
于 2012-06-17T17:35:55.137 に答える
1

私は答えを見つけたと思います:

仕様(7.4)のメンバールックアップセクションを見る必要がありました。

「ルックアップルールの効果は、派生メンバーが同じ名前または署名を持つベースメンバーを非表示にすることです。このような単一継承ルックアップは決してあいまいではありません。」

コンパイラがaobj.aを考慮した場合、aobjは当面無視され、aだけが考慮されると思います。

コンパイラーは、すべての静的メンバーとインスタンスメンバーを暗黙的または明示的に持つAクラス定義に移動し、2つのメンバーを確認します。どちらも(3.5)に基づいてアクセスできるため、一連の可能性があります。次に、隠れた変数が削除され、静的な変数が残ります。

最後に、「aobj」が考慮され、インスタンス参照が静的変数にアクセスできないため、エラーが発生します。

私の話にはいくつか問題があるかもしれません。もしそうなら、私はいくつかの推測をしたので私を訂正してください。

于 2012-06-17T20:18:45.463 に答える