为什么c#在多态中不考虑函数的返回类型?
本文关键字:函数 返回类型 不考虑 多态 为什么 | 更新日期: 2023-09-27 17:52:12
有两个函数具有相同的名称和相同的参数集,但返回类型不同。为什么它不是一种形式的多态性,即方法重载?为什么编译器不允许?
因为c#的设计使得可以从内部的到外部的分析类型。想象一下如果你有
int N() {}
float N()() {}
,然后调用
float x = N();
好的,很好,显然我们可以说浮点版本是需要的。然后你说:
void M(int x) {}
void M(float x) {}
M(N());
好的,现在需要哪个版本?规则是找出N()是什么意思,然后在知道N()是什么意思后找出M
的最佳过载是什么。从内部的推理到外部的。
基于返回类型的重载解析需要从外部的到内部的进行推理,这可能比困难很多。
考虑以下内容:
int combine(int a, int b) {
return a + b;
}
float combine(int a, int b) {
return a - b;
}
如果我调用combine(1, 2),编译器没有办法知道我要调用两个方法中的哪一个(这是不明确的)。
您几乎可以检查返回类型,但是:
var c = combine(1, 2);
dynamic d = combine(1, 2);
combine(1, 2);
在上面的例子中,c或d的值应该是多少?3 ?1 ?这很难说。最后一个语句呢,没有赋值?我没有定义返回void的重载,那么它应该调用这两个方法中的哪一个呢?
避免呼叫现场的歧义。考虑以下接口:
interface ISomething{
int DoSomething()
void DoSomething()
}
现在当你调用
myISomething.DoSomething()
应该调用哪个?
因为没有强制将返回类型赋值给变量。编译器不能强制将返回值赋给变量。即使强制这样做,停止将整数值赋给浮点数也是没有意义的。如另一个答案所示。
我相信这可以通过一组复杂的规则(强制无歧义)来实现,但它会引入许多意外破坏代码的方法。
由于规则不可避免的复杂(有点像PHP中的比较运算符),它会带来许多令人困惑的语言怪癖。
值得吗?我们从中得到了什么?"为什么不"这个问题应该反过来问:为什么是?