【问题标题】:Ambiguous invocation of third party reference第三方引用的模糊调用
【发布时间】:2016-05-10 19:14:04
【问题描述】:

在我为我的项目添加新引用之前,我的代码编译得很完美。 Telerik.Windows.Controls.ScheduleView

添加引用后,错误ambiguous invocation 已开始出现在字典键值对中。

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

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

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

请问如何解决第三方引用的模棱两可的调用。

我当前的代码

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

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

【问题讨论】:

  • Dictionary 类型也在提到的Telerik.Windows.Controls.ScheduleView中定义
  • 我想了这么多。但是如何指定应该使用哪个字典呢?
  • 试试这个命名空间:System.Collections.Generic.Dictionary
  • 你应该向 Telerik 提交一个错误,他们不应该有相同扩展的多个实现。

标签: c# telerik


【解决方案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 到库中,或者它们应该成为它们自己的命名空间的一部分,在那里它们可用于选择性导入。不过,这对那些误会图书馆的消费者没有任何帮助。

【讨论】:

  • 感谢您的深入回答。我很困惑如何使用 CollectionExtensions 方法
猜你喜欢
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
相关资源
最近更新 更多