【问题标题】:It says the call is ambiguous, but there is only one namespace它说调用不明确,但只有一个命名空间
【发布时间】:2021-08-18 18:23:22
【问题描述】:

我正在将一些代码移植到 .NET Standard 2.1,现在执行此操作时出现错误:

tmpQuote.SpecialCosts.RemoveAll(cqMainCost => dsSpecialCosts.Tables[0].AsEnumerable().Any(row => cqMainCost.Name == row.Field("CostName")));

它在 AsEnumerable() 上失败

以下方法或属性之间的调用不明确:'System.Data.DataTableExtensions.AsEnumerable(System.Data.DataTable)' 和 'System.Data.DataTableExtensions.AsEnumerable(System.Data.DataTable)'

通常在同一个方法名之间存在歧义,但在两个不同的命名空间中。

这里在同一个命名空间中,同一个方法名有歧义吗?

项目正在引用 nuget 包:System.Data.DataSetExtensions 而且该项目还引用了其他项目,这些项目又引用了相同的 nuget 包。

但这是很常见的事情,从来没有给我造成过这个问题。

更新:发现这个:https://github.com/dotnet/standard/issues/1622

这让我更仔细地研究了其他被引用的项目,它们是 2.0 而不是 2.1 将我的项目更改为 2.0 解决了这个问题。

【问题讨论】:

  • 代码和使用子句是什么?
  • 如果您引用两个定义相同扩展方法的 Dll,就会发生这种情况。例如,虽然您可以同时引用 Aspnet Appinsights Worker Service 应用程序洞察包,但当您尝试使用其中一种扩展方法时,您会收到与上述类似的错误(但对于 AI,当然),这是因为两个包在同一个命名空间中都有一个名为 XxxExtensions 的类,具有相同的方法和签名。编译器无法消除歧义,因此无法解决问题。您需要 VS 不支持的程序集别名。您可能会遇到类似的问题。
  • 这就是说,检查你引用的包(直接和传递)并确保你没有不必要的包。
  • 你写的很有意义。我希望有一种不那么蛮力的方法,因为这个疯狂的类有不少于 55 个“使用 xyz”(它是 18k 行)。如果我能看到发生碰撞的 2 个源/dll/引用,那就太好了

标签: c# namespaces extension-methods


【解决方案1】:

问题在于它是一个网络标准 2.1 项目,引用了其他网络标准 2.0 项目。并且 DataSetExtensions 在 2.0 和 2.1 中并不相同

将项目更改为 2.0 解决了问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 2014-12-10
    • 1970-01-01
    • 2015-06-06
    • 2014-10-15
    • 1970-01-01
    • 2012-05-07
    • 2013-10-30
    相关资源
    最近更新 更多