代码之家  ›  专栏  ›  技术社区  ›  g.pickardou

C#编译器:CS0121:以下方法或属性之间的调用不明确

c#
  •  11
  • g.pickardou  · 技术社区  · 10 年前

    这是自从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

    • 如果我将两个调用、两个方法定义(仅在两个位置进行了两次编辑)都更改为GetMessage2,那么仅引用GetMessage2就得到了完全相同的错误消息。

    • 使用VS 2015

    有什么想法吗?

    enter image description here

    这里是单一的方法:

    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;
            }
        }
    }
    

    enter image description here

    8 回复  |  直到 10 年前
        1
  •  25
  •   Jcl    10 年前

    确保您没有在项目引用中引用输出二进制文件(即项目引用本身)。我过去在Resharper(将输出二进制文件添加到项目引用中)中遇到过这种情况,因此扩展方法既在源代码中也在二进制引用中。

        2
  •  6
  •   serdar    8 年前

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

        3
  •  1
  •   Renat    7 年前

    得到相同的错误,因为我的项目引用了一个dll,同时对同一个dll具有可传递的依赖关系,但文件路径不同。

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

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

        4
  •  1
  •   Ayub    5 年前

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

    enter image description here

        5
  •  0
  •   Erdogan    9 年前

    我创建了一个新项目,并移动了除 “bin”、“references”、“obj” 和吊杆。它很有魅力。。

        6
  •  0
  •   jaimenino    5 年前

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

        7
  •  0
  •   LiliumCandidum    5 年前

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

        8
  •  0
  •   Tim Lovell-Smith    4 年前

    在我的案例中,我遇到了同样的问题[一个方法和它本身之间不可能的解决冲突],因为我使用了C#8.0及其闪亮的新特性来构建三个相互依赖的项目,它们是过渡的,如下所示:

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

    还有,我有 可空性检查 启用 只有 而对于项目B和C则完全禁用。

    对我来说,解决方法是启用null 注释 在项目B中(我在没有启用警告的情况下这样做)。

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