c# – 如果我选择不同的通用限制,为什么我不能用相同的参数重载
如果我在c#4.0 .NET中这样做
private static void myMethod<T>(int obj) where T : IDictionary { } private static void myMethod<T>(int obj) where T : ICollection { } 我收到以下错误.
我想知道为什么?据我所知,这两种方法都可以毫无歧义地调用? 如果我想要第一种方法,我会这样做 myMethod<IDictionary>(50) 和第二种方法 myMethod<ICollection>(40) 我错过了什么场景?有没有办法实现一组具有相同参数但不同类型的重载方法? 解决方法
过载仅基于功能参数.返回类型和模板参数(更具体地说:约束)不适用于重载函数.我不能告诉你为什么会这样(因为我没有写这种语言,也没有假装理解他们所有的担忧).我只能告诉你编译器允许的内容.
您可能希望在约束上重载的一个原因可能是尝试完成C模板特化的等效.不幸的是,C#不支持这一点. .Net泛型和C模板是极为不同的野兽. 关于你的具体例子;有两种方法可以解决这个问题.两者都要求您以不同的方式考虑您的问题. 真正的问题是你想要的用途会伤害你的设计.重载实际上只是语法糖.重载可帮助人们调用您的公共界面.它实际上并没有帮助你内部.实际上,如果重载方法做了很多不同的事情,那么在调试代码时,以及当你必须返回并维护代码时,可能会更难以对代码进行推理. 由于调用这些函数的代码必须指定T,因此您不会通过重载函数来节省任何维护成本.相反,您可以考虑将依赖项(集合)注入这些方法. private static void myMethod(int obj,IDictionary dictionary) { // do something with the dictionary here,setting private members while you do it } private static void myMethod(int obj,ICollection collection) { // do something with the collection here,setting private members while you do it } 如果此解决方案要求您经常复制新的Dictionary或新的List调用,或者如果您希望该方法控制何时创建实例,则可以简单地放弃重载. private static void myMethodWithDictionary<T>(int obj) where T : IDictionary,new() { // Create your new dictionary here,populate it,and set internal members } private static void myMethodWithCollection<T>(int obj) where T : ICollection,new() { // Create your new collection here,and set internal members } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |