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

标签 c# method-signature

<分区>

重复:Function overloading by return type?


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

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);

现在,您应该调用这两个原型(prototype)中的哪一个,尤其是当它们做两件完全不同的事情时?

基本上,在语言设计的早期就决定只使用函数名称和参数来决定调用哪个实际函数,在新标准到来之前我们一直坚持这一点。

现在,您已经标记了您的问题 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 的扩展会更容易。

关于c# - 为什么不能用相同的签名声明两个方法,即使它们的返回类型不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/584664/

相关文章:

c# - SQL LIKE 查询到 C# 代码

c# - 使用 JSON.net 序列化时忽略接口(interface)中定义的属性

php - 类型提示和默认参数值也是方法签名吗?

C++ typedef 成员函数签名语法

java - IntelliJ : Search for Checked exceptions, 在方法签名中声明,但从未在主体中抛出

c# - 用破折号格式化字符串

c# - DirectShow:图形在 GraphEdit 中工作,而不是在代码中工作

c# - Azure 类库访问 GetConfigurationSettingValue 与 web.config

java - 为什么抛出方法签名的一部分

objective-c - 为协议(protocol)方法键入编码字符串