加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如果我选择不同的通用限制,为什么我不能用相同的参数重载

发布时间:2020-12-15 23:57:52 所属栏目:百科 来源:网络整理
导读:如果我在c#4.0 .NET中这样做 private static void myMethodT(int obj) where T : IDictionary { } private static void myMethodT(int obj) where T : ICollection { } 我收到以下错误. Type ‘ConsoleApplication1.Program’ already defines a member call
如果我在c#4.0 .NET中这样做

private static void myMethod<T>(int obj) where T : IDictionary
    {


    }

    private static void myMethod<T>(int obj) where T : ICollection
    {


    }

我收到以下错误.

Type
‘ConsoleApplication1.Program’ already
defines a member called ‘myMethod’
with the same parameter
types

我想知道为什么?据我所知,这两种方法都可以毫无歧义地调用?

如果我想要第一种方法,我会这样做

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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读