从 .NET Framework 移植到 .NET 时出现不明确的扩展方法 GetValueOrDefault

Lio*_*nAM 1 .net c# extension-methods ambiguous-call

在将我的(大型)应用程序从 .NET Framework 4.X 移植到 .NET 5+ 时,偶然发现了System.Collections.Generic.CollectionExtensions.NET Framework 中不存在的新 .NET Framework。在它存在之前,我创建了一个扩展方法GetValueOrDefault,它具有与新方法类似的签名 - 但不同之处在于我检查空键并在这种情况下返回默认值而不是抛出异常。

在某些情况下,我得到了不明确的匹配 - 但并非总是如此(大概是因为我的方法有一个默认参数值)。现在,大部分时间都使用 .NET 版本,而我的应用程序到处崩溃......

有没有办法全局隐藏扩展方法或始终更喜欢我的版本?

PS:我知道存在类似的问题(模糊的扩展方法),但它已经很老了,约会于.NET core之前

关于重命名:实际上,我不想重命名我的方法。

  1. 它在 .NET Core 之前就已存在
  2. 当我重命名它时,我可能会不小心调用.NET版本(我已经习惯这个名字很多年了),这可能会在我不期望的时候抛出异常。我没有看到任何真正的用例,当这个方法抛出而不是返回默认值时会很有用。

Jon*_*eet 6

我想说这里最简单的解决方法是重命名您的扩展方法(例如NullKeySafeGetValueOrDefault),并在各处更改您的代码。

即使有一种微妙的方法可以让编译器更喜欢你的版本,最好还是坦率地对待它。无论何时有人阅读代码,他们都应该毫无疑问将调用哪个方法。

  • @LionAM:嗯,您将来使用的*每个*代码库都将拥有框架中的版本。而且代码库的每个新手至少“相当”可能会期望框架行为……从长远来看,这实际上“不是”一个好的位置,所以在我看来,最好尽快尝试修复它。 (4认同)
  • @LionAM - 那么您刚刚了解了拥有源代码控制系统的价值,您可以在开始升级之前从该点追溯创建分支,执行建议的重命名,然后向前合并... (2认同)
  • @LionAM:尝试*尽早*摆脱这种习惯/心态是明智的 - 否则,当您转移到一些没有扩展方法的*其他*代码库时,您将处于相同的情况,但是更多的时间来强化问题。 (2认同)