方法重载返回值

cha*_*day 19 c# overloading

在C#中,我需要能够定义一个方法,但让它返回一个或两个返回类型.我尝试这样做时编译器给出了一个错误,但为什么不知道我需要调用哪种方法呢?

int x = FunctionReturnsIntOrString();
Run Code Online (Sandbox Code Playgroud)

为什么编译器会阻止我使用具有不同返回类型的两个函数?

Tim*_*ter 26

C#3.0语言规范的 1.6.6节的最后一段开始:

方法的签名在声明方法的类中必须是唯一的.方法的签名包括方法的名称,类型参数的数量以及数量,修饰符和参数类型.方法的签名不包括返回类型.

在IL中,两种方法可以仅通过返回类型而不同,但是在反射之​​外,没有办法调用仅与返回类型不同的方法.

  • 感谢您的规格摘录! (5认同)

Jar*_*Par 22

虽然在这种特殊情况下可能很明显,但在许多情况下,这实际上并不明显.让我们以下面的API为例

class Bar { 
  public static int Foo();
  public static string Foo();
}
Run Code Online (Sandbox Code Playgroud)

在以下场景中,编译器根本不可能知道要调用哪个Foo

void Ambiguous() {
  Bar.Foo();
  object o = Bar.Foo();
  Dog d = (Dog)(Bar.Foo());
  var x = Bar.Foo();
  Console.WriteLine(Bar.Foo());
}
Run Code Online (Sandbox Code Playgroud)

这些只是一些快速的样本.肯定存在更多人为的和邪恶的问题.

  • 它在IL级别是合法的,但在IL级别没有"重载决策"这样的东西,所以这使得它更容易.在IL级别,您始终明确说明您要调用的方法. (2认同)

Kan*_*ane 10

你有没有使用泛型返回正确的类型.

public T SomeFunction<T>()
{
    return T
}

int x = SomeFunction<int>();
string y = SomeFunction<string>();
Run Code Online (Sandbox Code Playgroud)

注意:此代码尚未经过测试

  • 这段代码不起作用. (6认同)

aJ.*_*aJ. 9

仅与返回值不同的函数不符合重载条件.

int x = FunctionReturnsIntOrString();
double y = FunctionReturnsIntOrString();
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,编译器可以识别正确的函数,但考虑到未指定返回值的情况,它是不明确的.

FunctionReturnsIntOrString();   //int version
FunctionReturnsIntOrString();   //double version
Run Code Online (Sandbox Code Playgroud)

编译器无法解决重载方法.