【发布时间】: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