我有两个重载方法,都叫做FunctionX。其中一个返回一个Boolean对象,另一个返回一个名为Logs的预定义类。
我得到的错误是:以下方法或属性之间的调用不明确:'FunctionX(string)'和'FunctionX(string)'。
在我的其他一个方法中,我调用FunctionX(string),期望Log对象,但它抛出了这个错误。我认为编译器应该查看返回类型并自行计算。我该如何解决这个问题?
答案 0 :(得分:2)
使用相同的签名不能有多个函数,例如
string Function1(bool t)
int Function1(bool t)
您需要为每个函数调用不同的名称,或者使用不同的参数,例如
string Function1(bool t)
int Function1(bool t, int g)
答案 1 :(得分:2)
您不能使方法重载以具有不同的返回类型。编译器如何知道在这里调用什么?
string Foo() { /* ... */ }
int Foo() { /* ... */ }
object f = Foo();
语言设计人员需要考虑所有情况,而不仅仅是那些最微不足道的情况。
答案 2 :(得分:2)
除了返回类型之外,编译器无法区分具有相同方法签名的函数。据我所知,没有编译器可以强类型。您必须以某种方式更改签名。选项是使用泛型函数并提供返回类型。
答案 3 :(得分:2)
虽然像Perl和Haskell 这样的语言通过返回类型支持重载,但大多数静态类型语言不支持按返回类型重写函数。因此,最好不要将这个小问题作为代码的一部分。
<强>加强>:
您可以在此处的Stackoverflow讨论中找到更多答案:
答案 4 :(得分:1)
返回类型不会在C#中重载过载。
您可以,例如:
FunctionXToLog
和FunctionXToBool
FunctionX(string s, out Log logobject)
,FunctionX(string s, out bool value)
只是给你一个提示。
答案 5 :(得分:0)
您不能拥有两个具有相同签名的功能,只有不同的返回值!
答案 6 :(得分:0)
方法的签名是它的名称及其参数的类型 - 仅。它的返回类型是不是的签名部分。
因此您遇到了问题,因为这两种方法具有相同的签名。编译器不使用返回类型或所分配对象的类型来确定要调用的方法。
您必须指定所需方法的类名(假设这两个方法位于不同的类中)。或者您必须为其中一个方法提供另一个参数,以便为其提供不同的签名。或者,最后,您必须重命名其中一种方法才能使它们明确无误。