在C#中,我需要能够定义一个方法,但让它返回一个或两个返回类型.我尝试这样做时编译器给出了一个错误,但为什么不知道我需要调用哪种方法呢?
int x = FunctionReturnsIntOrString();
Run Code Online (Sandbox Code Playgroud)
为什么编译器会阻止我使用具有不同返回类型的两个函数?
Tim*_*ter 26
从C#3.0语言规范的 1.6.6节的最后一段开始:
方法的签名在声明方法的类中必须是唯一的.方法的签名包括方法的名称,类型参数的数量以及数量,修饰符和参数类型.方法的签名不包括返回类型.
在IL中,两种方法可以仅通过返回类型而不同,但是在反射之外,没有办法调用仅与返回类型不同的方法.
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)
这些只是一些快速的样本.肯定存在更多人为的和邪恶的问题.
Kan*_*ane 10
你有没有使用泛型返回正确的类型.
public T SomeFunction<T>()
{
return T
}
int x = SomeFunction<int>();
string y = SomeFunction<string>();
Run Code Online (Sandbox Code Playgroud)
注意:此代码尚未经过测试
仅与返回值不同的函数不符合重载条件.
int x = FunctionReturnsIntOrString();
double y = FunctionReturnsIntOrString();
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,编译器可以识别正确的函数,但考虑到未指定返回值的情况,它是不明确的.
FunctionReturnsIntOrString(); //int version
FunctionReturnsIntOrString(); //double version
Run Code Online (Sandbox Code Playgroud)
编译器无法解决重载方法.
| 归档时间: |
|
| 查看次数: |
16867 次 |
| 最近记录: |