为什么不能两种方法具有相同签名的声明,尽管它们的返回类型是不同的? [重复] 为什么不能两种方法

2019-05-12 08:34发布

复制 : 函数返回类型超载?


也许这是一个很无聊的问题,但我不明白为什么我不能宣称具有相同的签名时,他们有不同的返回类型的两种方法。

public class MyClass
{
    private double d = 0;

    public double MyMethod()
    {
        return d;
    }

    public string MyMethod()
    {
        return d.ToString();
    }
}

我得到指出类已经定义具有相同的参数类型成员的编译错误。

(很明显,我在我的代码使用这种方式是不是因为我的示例代码那样简单......但我认为它横跨有想法。)

我失去了一些关于面向对象的设计,使我想要做一个面向对象的反模式? 当然编译器应该能够确定我想只要我明确告诉它,我想其中一个使用哪种方法。

鉴于MyClass myClass = new MyClass(); 我希望下面的代码工作:

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

我希望下面的代码有问题:

var v = myClass.MyMethod();

但是,即使在的情况下, var应该导致编译错误。

任何人都可以看到我在做什么错在这里? 我更乐意予以纠正。 :-)

Answer 1:

这是因为类型强制的。

假设你有以下功能:

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会更容易些。



Answer 2:

有从调用你的方法没有“捕获”的返回类型阻止你什么。 有从这样阻止你什么:

myClass.MyMethod();

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

编辑:添加到的是,在C#3.0中,当您可以使用VAR,如何将编译器知道,当你这样做,你要调用一个方法:

var result = myClass.MyMethod();


Answer 3:

因为返回类型不是那么重要调用方法时。 它会引起歧义在很多情况下有方法只有返回类型不同。 您可能没有结果存储在一个变量在所有,或做这样的事情:

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

编译器就没有办法搞清楚,其中你想调用的方法。



Answer 4:

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



Answer 5:

什么,如果有的话,变量你分配方法无法告知编译器使用哪种方法。 想像:

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



文章来源: Why can't two methods be declared with the same signature even though their return types are different? [duplicate]