为啥 c# 或 c++ 不能根据返回类型区分方法? [复制]
Posted
技术标签:
【中文标题】为啥 c# 或 c++ 不能根据返回类型区分方法? [复制]【英文标题】:Why cannot c# or c++ differentiate methods based on return type? [duplicate]为什么 c# 或 c++ 不能根据返回类型区分方法? [复制] 【发布时间】:2011-09-05 22:07:33 【问题描述】:可能重复:Function overloading by return type?
如果我有两种方法:
myClass mc = new myClass();
double d = mc.GetPoint();
int i = mc.GetPoint();
为什么 C# 或 C++ 编译器不能将这些函数与其返回类型区分开来?尽管返回类型会是方法签名的一部分,但我会认为它是方法签名的一部分,就像任何方法参数一样。
为什么编译器不能处理这个?
【问题讨论】:
那么您如何期望var x = mc.GetPoint();
为C# 工作,或auto x = mc.GetPoint();
为C++ 工作?
仅仅作为签名的一部分并不能使其(返回类型)有资格选择特定的重载——还有其他设计因素需要考虑。
我看到 C# 创建者 Anders Hejlsberg 提出了这个问题。他指出,它并不总是像result = function(x)
那样简单。如果结果被传递给另一个也重载的函数,例如DrawPoint(mc.GetPoint());
?最终,此功能不可能在所有情况下都有效,而且无论如何只会提供有问题的实用性。
将函数调用基于返回类型是没有意义的。如果忽略返回值会发生什么?例如int x = foo();
与MyType x = foo();
。 foo();
怎么样?
【参考方案1】:
C# 支持动态类型,就像使用 var
时一样。那么编译器应该如何知道它应该调用哪个方法呢?
【讨论】:
虽然这是一个有效的参数 (+1),但var
不是动态类型。 var
只允许 C# 编译器应用一些非常基本的类型推断 来确定静态类型,而无需明确告知该类型是什么。 (这对于 LINQ 和匿名类型的操作非常关键。)
这是真的,但还有更多基本问题(没有引入var
)。 C++ 早在 auto
关键字意味着“请推断这种类型”之前就有这个限制:)
在这种情况下,编译器会要求程序员显式声明返回类型。以上是关于为啥 c# 或 c++ 不能根据返回类型区分方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不能在发布版本中将 char* 字符串从 C++ 返回到 C#?