为什么即使返回类型不同,也不能使用相同的签名声明两个方法?

重复 : 函数重载按返回类型?


也许这是一个非常愚蠢的问题,但我不明白为什么我不能声明两个具有相同签名的方法,当它们具有不同的返回类型时。

public class MyClass { private double d = 0; public double MyMethod() { return d; } public string MyMethod() { return d.ToString(); } } 

我收到一个编译错误,指出该类已经定义了具有相同参数类型的成员。

(显然我在我的代码中使用它的方式并不像我的示例代码那么简单……但我认为它可以解决这个问题。)

我是否遗漏了有关OO设计的内容,这使得我正在尝试进行OOP反模式? 当然,编译器应该能够确定我尝试使用哪种方法,只要我具体告诉它我想要哪一种方法。

给定MyClass myClass = new MyClass(); 我希望以下代码可以工作:

 double d = myClass.MyMethod(); string s = myClass.MyMethod(); 

我希望以下代码有问题:

 var v = myClass.MyMethod(); 

但即使在var的情况下,它也会导致编译错误。

谁能看到我在这里做错了什么? 我很乐意得到纠正。 🙂

这是因为类型强制。

假设您具有以下function:

 int x(double); float x(double); double y = x(1.0); 

现在,你应该打两个原型中的哪一个,特别是如果他们做两件完全不同的事情?

基本上,在语言设计的早期做出决定只使用函数名和参数来决定调用哪个实际函数,并且我们一直坚持使用它直到新标准到来。

现在,你已经标记了你的问题C#但我认为设计一种可以做你所建议的语言并没有错。 一种可能性是将上述任何模糊命令标记为错误,并强制用户指定应该调用哪些命令,例如使用强制转换:

 int x(double); float x(double); double y = (float)(x(1.0)); // overload casting double y = float:x(1.0); // or use new syntax (looks nicer, IMNSHO) 

这可以允许编译器选择正确的版本。 这甚至适用于其他答案提出的一些问题。 你可能会变得含糊不清:

 System.out.Println(myClass.MyMethod()); 

具体到:

 System.out.Println(string:myClass.MyMethod()); 

这可能会被添加到C#如果它不是一个标准过程太远(并且微软会倾听),但我认为你没有太大的机会在没有大量努力的情况下将它添加到CC++中。 也许将它作为gcc的扩展会更容易。

没有“捕获”返回类型就没有阻止你调用方法。 没有什么可以阻止你这样做:

 myClass.MyMethod(); 

在这种情况下,编译器如何知道要调用哪一个?

编辑:除此之外,在C#3.0中,当您可以使用var时 ,编译器在执行此操作时将如何知道您调用的方法:

 var result = myClass.MyMethod(); 

因为在调用方法时返回类型并不是那么重要。 在许多情况下,如果方法仅因返回类型而不同,则会导致模糊。 您可能根本不将结果存储在变量中,或者执行以下操作:

 System.out.Println(myClass.MyMethod()); 

编译器无法弄清楚您要调用哪种方法。

方法签名仅是名称和输入参数(类型和顺序)。 返回类型不是签名的一部分。 因此,具有相同名称和输入参数的两个方法是相同的并且彼此冲突。

您分配方法的变量(如果有),无法通知编译器使用哪种方法。 想像:

String message =“Result =”+ myClass.MyMethod();