C#泛型导致歧义type2){...}...}当然下面这行会产生模棱两可的调用编译错误:WidgetFoo=newWidget();...Foo.Bar(5);...有办法解决吗?有没有我可以在“where:TypeOf(T1)!=TypeOf(T2)”中放入的子句,或者有什么方法可以使它变得模棱两可?最好是int,int是可用的,但不是必须的。更新:对于那些感兴趣的人,实际上我自己(对我来说)找到了一个可以接受的解决这个问题的方法classWidget{...publicboolBar(objecto){if(o.GetType()==typeof(T1)){。..}if(o.GetType()==typeof(T2)){...}}...}是否有一个子句可以放在“where:TypeOf(T1)!=TypeOf(T2)”中您可以使构造函数在运行时抛出异常。但是在编译时没有办法阻止这种情况。有什么办法可以使这一点明确吗?您应该更改方法的名称,以免它们发生冲突。这是迄今为止最安全和最容易做的事情。事实上,IIRCCLR保留无法创建具有类似模棱两可的方法签名的类型的权利。(显然,我们的实施确实成功了,但是当你在玩这些恶作剧时,你是如履薄冰。)做这种事情是一个非常非常糟糕的主意,因为它会让你陷入各种各样的困境麻烦。以下是它如何可能会严重出错的示例:http://blogs.msdn.com/ericlippert/archive/2006/04/05/odious-ambiguous-overloads-part-one.aspxhttp://blogs.msdn。com/ericlippert/archive/2006/04/06/odious-ambiguous-overloads-part-two.aspx另请注意,编译器将阻止您创建一个类型,使其实现两个在构造上可能相同的接口。这是非法的:classC:IFoo,IFoo{...}因为您可以构造C而CLR无法知道哪些方法对应于哪些接口槽。但是我好像有点不对劲。回到主题。由于您是此类的创建者,您可以选择重命名“Bar”方法,以便它们在任何可能的构造下都不同。假设您固执地选择不这样做。如果您不幸的用户类别想要制作Widget,他们能做些什么吗?是的,实际上,正如kvb指出的那样。他们可以定义做正确事情的扩展方法。publicstaticvoidBarTheFirst(thisWidgetw,Aa){w.Bar(a);}publicstaticvoidBarTheFirst(thisWidgetw,Bb){w.Bar(b);}重载解析是在编译期完成的,在编译期我们都知道第一次调用Bar用“A”,第二次调用Bar用“B”。我们不会在运行时重新进行重载解析,所以现在你可以说Widgetw=whatever;w.BarTheFirst(5);w.BarTheSecond(10);它会做正确的事。给你的函数唯一的名字我同意其他人的意见,你应该改变你的类,这样就不会发生冲突(例如通过重命名方法)。但是如果你不拥有这个类,有一个解决方法:publicstaticclassWidgetExtensions{publicstaticboolBar1(thisWidgetw,T1t1){returnw.Bar(t1);}publicstaticboolBar2(thisWidgetw,T2t2){returnw.Bar(t2);您可以使用这些扩展方法来调用正确的Bar重载。静态方法不需要是扩展方法,但我认为它更清晰。这看起来像是你想要一个基本泛型类抽象类WidgetBase{publicabstractboolBar(T1type);...}然后继承你的实现以上就是C#学习教程:C#泛型导致歧义的全部内容,如果对你有用还需要进一步了解C#学习教程,希望大家多多关注—classWidgetA:WidgetBase{publicboolBar(inttype){...}}classWidgetB:WidgetBase{publicboolBar(inttype){...}}本文来源于网络,不代表立场.如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
