我们时常会为某一种具有相同的类(基类)或接口定义泛型的扩展方法,此时我们只需要在泛型扩展方法上加上泛型约束后,编译器在使用该类的派生类时就会自动筛选出可用的扩展方法。如下的定义:
1 2 3 4 5 | public interface Interface1 { } public class Class1 : Interface1 { } |
此时我们为Interface1定义一个扩展方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 | namespace Extension1 { public static class Class1Extensions { public static T AsActual<T>( this T o) where T : Interface1 { return o; } } } |

这很好,泛型的约束很好的表达了我们的意图。这个约束这时候能很好的避免这个扩展方法污染到其它类型的对象。接下来,当我们希望为再为其它的类型或接口定义相同的扩展方法时,有兴趣的事情就会发生,另外一个接口和实现:
1 2 3 4 5 | public interface Interface2 { } public class Class2 : Interface2 { } |
接下来我们再为Interface2,在不同的名称空间定义相同名称的扩展方法,但约束不一样:
1 2 3 4 5 6 7 8 9 10 11 12 | namespace Extension2 { public static class Class2Extensions { public static T AsActual<T>( this T o) where T : Interface2 { return o; } } } |
这时,我们再引用Extension2这个名称空间,编译下面的代码:
1 2 | Class1 obj = new Class1(); obj.AsActual(); |
此时就会编译失败,编译器告诉我们,它无法决定使用哪个版本的扩展方法。可问题是,我们分别对两个扩展方法进行了泛型约束了,当扩展方法名称不相同时,它们是不会互相污染的。出现这种奇怪的行为是编译器的bug,还是有什么理由可以来解释呢?扩展方法,虽然从使用上类似于类的成员方法调用,但是从IL级别来理解的话,它就是普通的静态函数调用。难道编译器无法做到自动去判断,相同名称而不同约束的泛型扩展方法?诡异
阿不 http://hjf1223.cnblogs.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2006-09-18 无刷新视图跳转的局限性