5

重复返回类型的函数重载?


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

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它的情况下也会导致编译错误。

谁能看到我在这里做错了什么?我很高兴得到纠正。:-)

4

5 回答 5

20

这是因为类型强制。

假设您具有以下功能:

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#如果它在标准过程中不太远(Microsoft 会倾听) ,那么它可能会被添加,但我不认为你有太多机会将它添加到CC++没有大量的努力。也许将其作为扩展gcc会更容易。

于 2009-02-25T04:01:04.320 回答
6

没有什么可以阻止您在不“捕获”返回类型的情况下调用您的方法。没有什么可以阻止你这样做:

myClass.MyMethod();

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

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

var result = myClass.MyMethod();
于 2009-02-25T04:01:03.977 回答
1

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

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

编译器无法确定您要调用哪些方法。

于 2009-02-25T04:04:42.003 回答
0

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

于 2009-02-25T04:00:47.083 回答
0

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

字符串消息 = "结果 = " + myClass.MyMethod();

于 2009-02-25T04:01:15.990 回答