【问题标题】:C# compiler: CS0121: The call is ambiguous between the following methods or propertiesC# 编译器:CS0121:以下方法或属性之间的调用不明确
【发布时间】:2021-09-03 06:48:36
【问题描述】:

这是我见过的最疯狂的事情,因为 Fody 插件通过发出无效代码破坏了我的程序集,并且控制流在运行时随机变化......这次没有 Fody。

事实:

  • 整个故事都在一个项目中。
  • GetMessage 扩展方法已存在数周...
  • 问题从 2 小时开始出现,我无法弄清楚它是什么。
  • GetMessage 扩展方法只有一种。
  • 错误信息(见图)列出了两个相同的方法规范

    Error CS0121 The call is ambiguous between the following methods or properties: 'ComiCalc.Data.ExceptionExtensions.GetMessage2(System.Exception)' and 'ComiCalc.Data.ExceptionExtensions.GetMessage2(System.Exception)' ComiCalc.Data D:\2014Develop\.vsonline\ComiCalc\src\ComiCalc.Data\Services\UserService.cs 61

  • 如果我将两个调用、方法定义(仅在 2 个地方的 2 个编辑)都更改为 GetMessage2,那么我得到的错误消息与 GetMessage2 完全相同。

  • 使用 VS 2015

有什么想法吗?

这是唯一一种方法:

namespace ComiCalc.Data
{

    using System;
    using System.Data.Entity.Validation;
    using PluralTouch.DataAccess;
    // TODO: Move to PluralTouch
    public static class ExceptionExtensions
    {
        public static string GetMessage2(this Exception exception)
        {

            var message = exception.Message;
            if (exception is DbEntityValidationException)
            {
                message = ((DbEntityValidationException) exception).DbEntityValidationResultToString();
            }
            return message;
        }
    }
}

【问题讨论】:

  • 你为什么要发布代码截图?请在其中获取实际代码。
  • 这是一个网络应用程序吗?
  • @Jashaszun:如果你关心阅读这个问题,你会认识到这个问题不是关于代码,而是关于 IDE 和/或编译器。我花了 1 多个小时来弄清楚发生了什么,并花了 15 分钟以上来描述我所经历的一切,并且屏幕截图可以为您提供我所看到的最接近的体验。无论如何,感谢那些点击而不阅读的人的 3 个缺点
  • @g.pickardou 如果您要展示的东西用图像更好地展示(例如构建设置),那么屏幕截图就可以了。然而,代码和错误消息总是通过文本更好地传达。
  • 再一次:查看正确答案:它证明我的问题在其初始版本中有所有诊断信息来诊断正在发生的事情,而该问题与代码无关跨度>

标签: c#


【解决方案1】:

确保您没有在项目引用中引用输出二进制文件(即项目引用自身)。过去使用 Resharper(将输出二进制文件添加到项目引用中)在我身上发生过这种情况,因此扩展方法在源代码和二进制引用中都存在。

【讨论】:

  • 谢谢伙计。我从来没有弄清楚这一点。我觉得有一些未更新的参考可以做到这一点,所以我已经清理了所有,但在看到问题出在同一个程序集中之后,我拒绝了这个假设。而且是的,那是 Resharper。
  • 感谢帮助。我在同一个程序集中也遇到了问题,并且正在使用 resharper。 resharper 优化使用修复了它。
【解决方案2】:

删除 bin 文件夹 > 打开项目 > 构建解决方案。

【讨论】:

    【解决方案3】:

    因为我的项目引用了一个 dll,并且同时对同一个 dll 但在不同的文件路径有传递依赖关系,所以遇到了同样的错误。

    通过搜索依赖项 dll 名称,在构建期间使用额外的日志记录(工具 -> 选项 -> 构建和运行 -> 输出详细信息或诊断)发现它:在任务“Csc”中,出现了两次 /reference dll

    修复是指向同一个 dll 路径的引用

    【讨论】:

      【解决方案4】:

      我创建了一个新项目并移动了除 'bin'、'references'、'obj' 和 boom 之外的所有文件。它就像魅力一样..

      【讨论】:

        【解决方案5】:

        我有两个由数据库工具创建的确切类,因为使用不同的参数执行了 2 次。我按类名搜索并删除较新的,然后一切正常。

        【讨论】:

          【解决方案6】:

          就我而言,我的项目文件夹中有“发布”文件夹。删除“发布”文件夹为我解决了这个问题。

          【讨论】:

            【解决方案7】:

            在我的例子中,Resharper 创建了一个名为Annotations1.cs 的新文件。我刚刚删除它并解决了问题。也许您需要删除调试/发布/obj和清理/重建解决方案。

            【讨论】:

              【解决方案8】:

              在我的例子中,我遇到了同样的问题 [单个方法与其自身之间不可能解决冲突],因为我使用 C# 8.0 及其闪亮的新功能来构建三个相互依赖的项目,传递地,像这样:

              • 项目 C 依赖于项目 B。
              • 项目 B 依赖于项目 A。
              • 项目 C 从项目 B 中继承项目 A 类型的类型调用 API。其中一些 API 具有可为空的引用类型参数。

              此外,我可空性检查为项目 A 启用,而为项目 B 和 C 完全禁用。

              对我来说,解决方法是在项目 B 中启用可为空的注释(我这样做时也没有启用警告)。

              我推测这通过确保没有两种完全不同的编译器模式(可空注释的开/关)重新处理相同的接口定义,同时构建两个项目(A 和 B),然后设置冲突的可空性来解决问题各自输出的注释。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-04-08
                • 1970-01-01
                • 1970-01-01
                • 2011-10-04
                • 2012-02-09
                • 2020-01-19
                • 1970-01-01
                相关资源
                最近更新 更多