当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么即使返回类型不同,也不能使用相同的签名声明两个方法?》经验,为你挑选了2个好方法。

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


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

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

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



1> paxdiablo..:

这是因为类型强制.

假设您具有以下功能:

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



2> BFree..:

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

myClass.MyMethod();

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

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

var result = myClass.MyMethod();

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有