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
,可以在子类中调用它,而无需在基类前面加前缀。也许这能给我们一些启示: