在.NET中,如果某个类包含方法Foo<T>(T t)
(无约束)和方法Foo(字符串s),则调用Foo("test")
会调用Foo
接受{ {1}}。这一切都很好,除非string
重载是一种扩展方法,在这种情况下,总是调用泛型版本。这个问题是否有一些解决方法,或者我运气不好?
答案 0 :(得分:4)
简短回答:否
在C# 5.0 Language Specification的第163页中,我们可以看到在对Method Group
(一组重载方法)进行了所有重载解析后,找不到合适的候选者时,编译器会尝试搜索适用的扩展方法。这意味着所有时髦的东西,如泛型类型推断将优先于扩展方法。引用:
如果生成的候选方法集合为空,则放弃沿着以下步骤的进一步处理,而是尝试将调用作为扩展方法调用进行处理(第7.6.5.2节)。如果失败,则不存在适用的方法,并发生绑定时错误。