繁体   English   中英

第三方引用的模糊调用

[英]Ambiguous invocation of third party reference

我的代码编译得很完美,直到我添加了对我的项目的新引用。 Telerik.Windows.Controls.ScheduleView

添加引用后,Dictionary Key Value Pairs 开始出现错误ambiguous invocation

以下方法或属性之间的调用不明确:

'Telerik.Windows.Diagrams.Core.CommonExtensions.AddRange<System.Collections.Generic.KeyValuePair<string,object>>(System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<string,object>>, System .Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,object>>)'

'Telerik.Windows.Controls.CollectionExtensions.AddRange<System.Collections.Generic.KeyValuePair<string,object>>(System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<string,object>>, System.Collections .Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string,object>>)'

请问如何解决第三方引用的不明确调用。

我当前的代码

var selectedTargetGroups = new Dictionary<string, object>();
selectedTargetGroups.AddRange(TargetGroups.Where(x => (int) x.Value == current.TargetGroupList.Id));

解决此问题的一种方法是使用 .Add 而不是 AddRange。 但任何其他选择都会有很大帮助。

没有简单的方法可以做到这一点。 如果两个扩展方法在具有相同签名的范围内,则无法消除它们之间的歧义,除非使用非扩展语法明确指定您想要的实现。 在你的例子中:

var selectedTargetGroups = new Dictionary<string, object>();
CollectionExtensions.AddRange(
   selectedTargetGroups, 
   TargetGroups.Where(x => (int) x.Value == current.TargetGroupList.Id)
);

除了丑陋和暴露托管扩展方法的类的名称(可能会更改)之外,如果您有很多不想以这种方式更改的现有代码,这也不好。

另一种解决方法是确保包含您不想要的任何扩展方法的类型不在范围内。 所以而不是写作

using Telerik.Windows.Controls;
using Telerik.Windows.Diagrams.Core;

通过使用别名明确您想要的类型:

using ScheduleView = Telerik.Windows.Controls.ScheduleView;
using Telerik.Windows.Diagrams.Core;

显然,如果您确实需要命名空间中的所有(或几乎所有)类型,则此解决方法可能非常麻烦。 请注意,无法通过为包含它们的类引入别名来消除扩展方法的歧义:别名类型的扩展方法不会作为扩展方法出现。 (它们也不会消失,因此您不能以这种方式“隐藏”不需要的扩展方法。)

最好的解决方案是确保不会发生这种情况,但这需要图书馆作者的合作。 在像库中的ICollection这样通用的类型上定义可公开访问的扩展方法绝对是错误的,因为这只会引发冲突。 扩展方法应该只在库定义的类型上定义,或者它们应该保留在库的internal ,或者它们应该成为它们自己的命名空间的一部分,在那里它们可用于选择性导入。 但是,这对误会图书馆的消费者没有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM