我的代码编译完美,直到我添加了对我的项目的新引用。 Telerik.Windows.Controls.ScheduleView
添加引用后,错误ambiguous invocation
已开始出现在Dictionary Key Value Pairs中。
以下方法或属性之间的调用不明确:
“Telerik.Windows.Diagrams.Core.CommonExtensions.AddRange< System.Collections.Generic.KeyValuePair<串,对象>>(&了System.Collections.Generic.ICollection LT; System.Collections.Generic.KeyValuePair<串,对象&gt ;>中 System.Collections.Generic.IEnumerable< System.Collections.Generic.KeyValuePair<串,对象>&GT)'
和
“Telerik.Windows.Controls.CollectionExtensions.AddRange< System.Collections.Generic.KeyValuePair<串,对象>>(&了System.Collections.Generic.ICollection LT; System.Collections.Generic.KeyValuePair<串,对象>&GT ;,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。但任何其他选择都将是一个很大的帮助。
答案 0 :(得分:1)
没有简单的方法可以做到这一点。如果两个扩展方法在具有相同签名的范围内,则除非使用非扩展语法明确指定所需的实现,否则无法消除它们之间的歧义。在您的示例中:
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
到库中,或者它们应该成为它们自己的命名空间的一部分,它们可以选择性地导入。但是,对于那些错误的图书馆的消费者来说,这没有任何帮助。