我就回答最后一个问题吧,为什么不能设计为编译不通过。
首先,扩展方法通常是在接口上扩展,所以譬如说Contains方法,要么不能在IEnumerable扩展,要么就要修改现有的List的实现,无论哪一种都很坑爹。
其次,不论是类型本身还是扩展方法,都可能不存在于自己编写的代码中(例如上文中的List和Enumerable),所以一旦两个东西冲突就面临二选一的问题。当然你可以选择不using命名空间,这样就永远不会选择扩展方法的重载,但是这显然非常的麻烦。
当然,你想的是编写扩展方法的程序集编译的时候不能被编译通过。但实际上这也行不通,因为编写扩展方法的程序集编译的时候被扩展的类型还没有这个方法。此时是合法的,但是编译后,被扩展的类型程序集升级了多个这个方法,所以你要报错,则只可能在使用这个方法的时候。
C#的方法重载决策规则过于复杂的确是给很多萌新带来了很多的困扰,这是客观事实。但实际上另一方面让人使用了意料之外的重载,本质上也是库函数本身质量的问题。但不可回避的是,由于重载规则的过于复杂,导致dotnet本身的库函数都不可避免地带来一些意料之外重载。
例如典型的View方法的View(string, object)和View(string,string)重载,当ViewModel是string的时候,如果想当然地直接调用View方法,则会错误的命中第二个重载。
这种例子其实还是很多的……
然后每次C#语法升级,方法重载策略就要更复杂一些,在未来会成为C#的包袱也说不定。
毕竟目前就有个天坑:0可以隐式转换为任意枚举值并且重载优先级还挺高的。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有