为啥 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++ 不能根据返回类型区分方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

c++中重载输出操作符,为啥要返回引用

为什么不能根据返回类型来区分重载

C++:仅根据函数返回值类型不能实现重载

为啥我不能在发布版本中将 char* 字符串从 C++ 返回到 C#?

为啥 char** 不能成为 C++ 中以下函数的返回类型?

从 C++ 库方法返回的“char*”获取 C# 字符串?