为什么我不允许使用具有相同签名的静态和非静态方法?
假设我有一个这样的课程
public class TestClass
{
public object thing { get; set; }
public TestClass()
{
}
public TestClass(object thing)
{
this.thing = thing;
}
public static TestClass ConvertTestClass(object thing)
{
return new TestClass(thing);
}
public TestClass ConvertTestClass(object thing)
{
this.thing = thing;
return this;
}
}
Run Code Online (Sandbox Code Playgroud)
我试着像这样使用它
public class SomeOtherClass
{
public SomeOtherClass()
{
TestClass tc = TestClass.ConvertTestClass(new object());
TestClass tc2 = new TestClass();
tc2.ConvertTestClass(new object());
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误 TestClass.ConvertTestClass(new object());
以下方法或属性之间的调用是不明确的:'TestClass.ConvertTestClass(object)'和'TestClass.ConvertTestClass(object)'
和这些错误 tc2.ConvertTestClass(new object());
以下方法或属性之间的调用是不明确的:'TestClass.ConvertTestClass(object)'和'TestClass.ConvertTestClass(object)'
无法使用实例引用访问成员'TestClass.ConvertTestClass(object)'; 用类型名称来限定它
编译器真的不能告诉该方法的静态和非静态版本之间的区别,或者我在这里遗漏了什么?
我没有使用ReSharper(这似乎是其他问题中类似问题的根源).
它会给你一个错误,所以可以肯定的是,编译器不能或不会区分这两种方法。
无论如何,执行这种重载可能是个坏主意,因为不清楚您打算调用哪个方法,但如果这还不够,C# 5 规范定义了如下的方法签名(第 3.6 节):
方法的签名由方法的名称、类型参数的数量以及每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。出于这些目的,出现在形式参数类型中的方法的任何类型参数不是通过其名称来标识,而是通过其在方法的类型参数列表中的序号位置来标识。具体来说,方法的签名不包括返回类型、可能为最右边的参数指定的 params 修饰符,也不包括可选的类型参数约束。
它没有明确提及static,但也没有将其作为“签名”定义的一部分。因此,可以公平地假设,根据规范,方法重载不能仅在静态或实例化这一事实上有所不同。