当前位置: 首页 > 编程语言 > C#

泛型重载方法解析问题分享

时间:2023-04-10 12:20:42 C#

泛型重载方法解析问题我有两个方法使用了这些签名:获取单个对象或它们的列表。如果我尝试将List传递给它,它会解析为第一种方法,而我需要第二种方法。我不得不使用list.AsEnumerable()来解决它的问题。列表是否为T[]、IList、List、Collection、IEnumerable等类型,有没有办法让它解析为第二个。最佳解决方案:首先不要去那里。这是一个糟糕的设计。您会注意到没有一个框架类会这样做。列表有两种方法:Add和AddRange。第一个添加一个项目,第二个添加一系列项目。这是一个糟糕的设计,因为您正在编写一个自动生成错误的设备。再次考虑可变列表的示例:Listmyqueries=newList();myqueries.Add(fromcincustomersselectc.Name);myqueries.Add(fromoinorderswhereo.Amount>10000.00mselecto);您要向查询列表中添加两个查询;如果Add被重载以获取序列,那么这会将查询的结果添加到列表中,而不是查询。您需要能够区分查询及其结果;它们在逻辑上是不同的。最好的方法是让方法有两个不同的名字。如果你被这个糟糕的设计吓倒了,当你做的时候你会受伤,不要做。过载解析旨在找到最佳匹配。不要试图使决议过载,以免它做更糟的事情。同样,这是令人困惑且容易出错的。使用其他机制来解决问题。例如:staticvoidFrob(IEnumerablets)//不是通用的!{foreach(ts中的对象t)Frob(t);}staticvoidFrob(Tt){if(tisIEnumerable)Frob((IEnumerable)t);else//otherwise,frobasingleT.}现在无论用户给你什么——一个T数组,一个T列表数组,无论如何,你最终只会擦除单个T。但同样,这几乎肯定是个坏主意。不要这样做。具有不同语义的两种方法应该有不同的名称。取决于你是否这样做:varlist=newList();方法>(列表);//将解析为第一个重载。或者:varlist=newList();方法(列表);//将解析为第二个重载。发生这种情况是因为,编译器选择了最具体的方法,所以在使用泛型Method(Tdata)的地方,它被编译为Method>(Listdata),比IEnumerable更重重载决策将尝试找到最匹配的重载.在IEnumerable重载的情况下,您确实需要显式强制转换或使用IEnumerable,因为那确实是最佳匹配。否则,简单的泛型重载将被认为是更好的匹配。有关详细信息,请阅读EricLippert的“过载解决方案”博客条目。拥有对单个事物或一组事物进行重载的方法是不寻常的,不是吗?为什么不voidMethodSingle(Tdata){Method(newT[]{data});}voidMethod(IEnumerabledata){}我建议,编译器和读者都更清楚。问题:无论列表是T[]、IList、List、Collection、IEnumerable等类型,有没有办法让它解析为秒。T[]不是列表而是数组,所以可能不是。我不确定这是否有帮助,但你可以尝试创建一个有界方法publicvoidMethod(Udate)whereU:IList{/*...*/}为什么不扩展这样的方法:以上是C#学习tutorial:通用重载方法解析问题分享的全部内容,如果对大家有用需要了解更多C#学习教程,希望大家多多关注—voidMethod(Tdata){varenumerable=dataas可数;如果(可枚举!=null){方法(可枚举);返回;}...}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: