我写错了
Equals( s1, s2 );
而不是
string.Equals( s1, s2 );
并且MS VS编译器成功编译了代码。
为什么编译器找到静态方法Equals?这是编译器的错误吗?
例如,你可以写
Console.WriteLine("compare {0} to {1}: {2}",
s1, s2, Equals( s1, s2));
但你可能不会写
Console.WriteLine("compare {0} to {1}: {2}",
s1, s2, Compare(s1, s2));
编辑: 似乎静态函数Equals调用可以在每个派生类中覆盖的非静态成员函数Equals。那么问题是在哪里可以看到静态函数的定义等于类对象?
答案 0 :(得分:3)
因为所有类都从Object类继承了Equals
方法。这是你在第一个例子中调用的方法。
您可以省略类名,因为您位于object
类的上下文中。考虑这个简单的例子:
public class Foo
{
public static void FooMethod() { }
}
public class Bar : Foo
{
public Bar()
{
FooMethod();
}
}
您可以在此处通过省略类名来致电FooMethod
,因为Bar
继承自Foo
。
我不知道specs中指定的位置是什么(在派生类中调用静态方法时省略了类名),但是你可以查看this documentation。它说:
当您定义要从另一个类派生的类时,派生类会隐式获取基类的所有成员,但其构造函数和析构函数除外。因此,派生类可以重用基类中的代码,而无需重新实现它。
还要注意那里的表格:
您可以看到这两个类都继承自object及其成员。另外,如果你看一下这个例子,你可以看到他们在调用基类方法时也省略了类名,在ChangeRequest
类的第二个构造函数中。
public ChangeRequest(string title, string desc, TimeSpan jobLen,
int originalID)
{
// The following properties and the GetNexID method are inherited
// from WorkItem.
this.ID = GetNextID();
...
}
答案 1 :(得分:0)
我会自己回答我的问题。
其体内的静态方法Equals
调用虚拟非静态方法Equals
。由于这个非静态方法Equals
被覆盖了类string
,因此静态方法进行了正确的比较。
调用静态方法时没有类名,因为所有的clae都是从类对象派生的。