鉴于:
class BaseClass
{
public virtual void M(int x)
{
}
}
class Derived : BaseClass
{
public override void M(int x)
{
base.M(x);
}
static void M(object x)
{
}
static void Main()
{
var d = new Derived();
d.M(0);
}
}
错误:
无法使用实例引用访问成员“Derived.M(object)”;改为使用类型名称来限定它
查看 C# 4.0 规范第 7.4 节(成员查找),第一个要点如下:
对类型 T 中具有 K 个类型参数的名称 N 的成员查找处理如下:
[...] 包含 override 修饰符的成员被排除在 [名为 N 的可访问成员] 的集合中
由此我得出结论,覆盖Derived.M
不再可访问。相反,编译器必须引用BaseClass.M
.
但是,这并不能解释为什么添加静态Derived.M
会突然导致编译错误。编译器现在只能看到静态成员 Derived.M
并断定该成员是无效调用。如果我删除静态Derived.M
然后编译成功。
为什么会这样?