对静态方法使用非限定名称类字符串的等于

时间:2014-08-07 10:58:57

标签: c# equals

我写错了

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。那么问题是在哪里可以看到静态函数的定义等于类对象?

2 个答案:

答案 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。它说:

  

当您定义要从另一个类派生的类时,派生类会隐式获取基类的所有成员,但其构造函数和析构函数除外。因此,派生类可以重用基类中的代码,而无需重新实现它。

还要注意那里的表格:

enter image description here

您可以看到这两个类都继承自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都是从类对象派生的。