来自Anders Hejsberg采访的文章中提到,“我们在C#中进行重载决策的方式与其他任何语言都不同。” 有人可以提供一些关于C#和Java的例子吗?
来自Anders Hejsberg采访的文章中提到,“我们在C#中进行重载决策的方式与其他任何语言都不同。” 有人可以提供一些关于C#和Java的例子吗?
Anders的意思是,最初的设计团队明确地设计了重载解析算法,使其具有在版本控制场景下表现良好的某些属性,尽管考虑没有版本控制的场景时,这些属性似乎是反向或令人困惑的。
在C#中,最常见的例子可能是以下规则:如果更派生类中的任何方法是适用的候选项,则它比较少派生类中的任何方法自动更好,即使较少派生的方法具有更好的签名匹配。据我所知,在其他具有重载解析的语言中并没有这个规则。这似乎是违反直觉的,如果有一个更好的签名匹配的方法,为什么不选择它呢?原因是因为更好的签名匹配的方法可能是在后续版本中添加的,从而引入“脆弱的基类”故障。
有关各种语言如何处理“脆弱的基类”故障的更多想法,请参见:
有关重载解析的更多想法,请参见:
C#从内部角度处理重载的方式是不同的。
Anders的完整引用:
我一直把自己描述为一个实用主义者。有趣的是,版本控制最终成为我们语言设计的支柱之一。它出现在你如何覆盖C#中的虚拟方法上。此外,我们在C#中执行重载决策的方式与我所知道的任何其他语言都不同,原因是版本控制。每当我们考虑设计特定功能时,我们总是会与版本控制进行交叉检查。我们会问:“版本控制如何改变这个?从版本控制的角度来看,这个函数如何?”结果发现,大多数语言设计以前很少考虑到这一点。