为什么我无法访问行中的隐藏实例变量a(int gimmeValue = shinyNewBObject.a;)?我知道我可以使用base关键字来访问实例a。但是,我认为编译器会使用shinyNewBObject中的对象引用来排除静态变量。如果排除了静态版本的a,则实例版本的a将被取消隐藏,因此可以访问。
这里发生了什么?编译器是否创建了程序集中所有标识的列表并排除了实例变量,因为它在排除另一个之前是隐藏的,因为它是静态的?
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;
}
}
答案 0 :(得分:4)
我不完全确定C#规范的哪一部分规定了当它被子类中的静态字段遮挡时它不会让你访问基类型变量的原因,但为了解决它,你可以强制转换为{ {1}}:
A
答案 1 :(得分:1)
我想我找到了答案:
我需要查看规范的成员查找部分(7.4)。
“查找规则的效果仅仅是派生成员隐藏具有相同名称或签名的基本成员。这种单继承查找从不模糊。”
我认为当编译器考虑aobj.a时会发生什么,aobj暂时被忽略,只考虑a。
编译器转到A类定义,它隐式或显式地包含所有静态和实例成员,并将两者视为成员。两者都可以根据(3.5)访问,因此它们可以进入一系列可能性。然后删除隐藏变量,留下静态变量。
最后考虑“aobj”并发生错误,因为实例引用无法访问静态变量。
我的故事可能存在一些问题。如果是这样,请更正我,因为我做了一些猜测。