Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为类字符串的静态方法使用非限定名称_C#_Equals - Fatal编程技术网

C# 为类字符串的静态方法使用非限定名称

C# 为类字符串的静态方法使用非限定名称,c#,equals,C#,Equals,我写错了 Equals( s1, s2 ); 而不是 string.Equals( s1, s2 ); MS VS编译器成功地编译了代码 为什么编译器发现静态方法等于?这是编译器的错误吗 例如,你可以写 Console.WriteLine("compare {0} to {1}: {2}", s1, s2, Equals( s1, s2)); 但你不能写 Console.WriteLine("compare {0} to {1}: {2}", s1, s2, Compare

我写错了

Equals( s1, s2 );
而不是

string.Equals( s1, s2 );
MS VS编译器成功地编译了代码

为什么编译器发现静态方法等于?这是编译器的错误吗

例如,你可以写

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,这些函数可以在每个派生类中被覆盖。所以问题是在哪里可以看到类对象的静态函数Equals的定义?

,因为所有类都从对象类继承了一个
Equals
方法。这就是您在第一个示例中调用的方法

您可以省略类名,因为您位于
对象的上下文中。考虑这个简单的例子:

public class Foo
{
    public static void FooMethod() { }
}

public class Bar : Foo
{
    public Bar()
    {
        FooMethod();
    }
}
这里您可以通过省略类名调用
FooMethod
,因为
Bar
继承自
Foo


我不知道这在规范中的具体位置(在派生类中调用静态方法时省略类名),但您可以查看一下。它说:

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

还要注意其中的表格:

您可以看到,这两个类都继承自对象及其成员。另外,如果您查看该示例,您可以看到,在调用基类方法时,
ChangeRequest
class的第二个构造函数中,它们也省略了类名

public ChangeRequest(string title, string desc, TimeSpan jobLen,
                     int originalID)
{
    // The following properties and the GetNexID method are inherited  
    // from WorkItem. 
    this.ID = GetNextID();
    ...
}

我会亲自回答我的问题

静态方法
Equals
在其体内调用虚拟非静态方法
Equals
。由于类
string
覆盖了此非静态方法
Equals
,因此静态方法会进行正确的比较。
调用静态方法时没有类名,因为所有类都是从类对象派生的。

我觉得它是
object.Equals(object objA,object objB)
这是一种
静态
方法。Equals是System.Object的一种方法,因此函数中有它block@TimSchmelter在哪里写的,在这种情况下,我可以省略方法调用中的类名?@vladfrommosco:没有
对象。比较
方法,如果你引用
字符串。比较
你就是不允许,因为您的类不是从
字符串继承的(这是不可能的,因为它是
密封的
)。这就是为什么即使在静态方法上也需要显式声明类:
string.Compare(“A”、“B”)
和什么?在这种情况下,我可以在方法调用的名称中省略类名,这是哪里写的?@vladfrommosco:您在继承对象的类的上下文中调用了Equals。与任何其他成员方法相同。@Marcel N.对不起,我不明白这是什么意思。你能给我一份MSDN文档的参考资料吗?该文档说,如果使用类对象的静态方法,我可能会省略类名?|@Marcel N顺便说一句,我可能不会写例如Compare(s1,s2)。因此,完全不清楚什么是“类的上下文”。@VladfromMoscow:我找不到您想要的文档,必须在C#spec中(或者可能不在任何地方指定,因为这是常识)。但不确定这有什么大不了的。在基类(即对象)中有静态方法
Equals
,可以在子类中调用它,而无需在基类前面加前缀。也许这能给我们一些启示: