重复:函数重载按返回类型?
也许这是一个非常愚蠢的问题,但我不明白为什么我不能声明两个具有相同签名的方法,当它们具有不同的返回类型时.
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
它的情况下也应该导致编译错误.
谁能看到我在这里做错了什么?我很高兴得到纠正.:-)
这是因为类型强制.
假设您具有以下功能:
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#
如果在标准流程中并没有太远(并且微软会倾听),这可能会被添加到但是我认为你没有太大的机会在有C
或C++
没有大量努力的情况下添加它.也许做它作为扩展gcc
会更容易.
没有"捕获"返回类型就没有阻止你调用方法.没有什么可以阻止你这样做:
myClass.MyMethod();
在这种情况下,编译器如何知道要调用哪一个?
编辑:除此之外,在C#3.0中,当您可以使用var时,编译器在执行此操作时将如何知道您正在调用的方法:
var result = myClass.MyMethod();