C#编译器: CS0121: 这个调用在以下方法或属性之间存在歧义

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(只需在2个位置进行2个编辑),然后我会得到完全相同的错误消息,只是引用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;
        }
    }
}

在此输入图片描述


13
为什么要张贴代码截图?请将实际的代码粘贴到其中。 - Jashaszun
这是一个网络应用程序吗? - Ron Beyer
5
如果您关心阅读问题,您会认识到这个问题不是关于代码而是关于IDE和/或编译器。我已经花费了一小时以上来弄清楚发生了什么,并花费了15分钟以上来描述我所经历的所有事情,并且屏幕截图在那里以便让您体验我所看到的最接近的情况。无论如何,感谢那些没有阅读就点赞的人给了我三个负面评价。 - g.pickardou
尝试重建整个项目。通常我会删除 bin 文件夹以强制重新编译所有代码。我怀疑你编译的代码中有库的更改,可能正在使用不同的库或旧版本的库。 - jdweng
2
如果您正在展示最好用图像显示的内容(例如构建设置),那么截图是可以的。但是,代码和错误消息则最好通过文本进行传达。 - Jashaszun
1
再次强调:请看正确的答案:这证明我的问题在初始版本中已经包含了所有诊断信息,以便诊断发生了什么问题,而问题并不是代码本身引起的。 - g.pickardou
11个回答

28

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


谢谢,我一直没搞清楚这个问题。我有一种感觉,可能是因为某些未更新的参考资料可以解决这个问题,所以我进行了清理,但是在看到问题出现在同一个程序集中后,我否定了这个假设。而且没错,那是Resharper。 - g.pickardou
谢谢,这个帮了我很大的忙。我也在同一个汇编问题上遇到了困难,并且正在使用resharper。使用resharper的“优化using语句”修复了它。 - Shiraz Bhaiji

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

1
在我的情况下,Resharper创建了一个名为Annotations1.cs的新文件。我只需将其删除即可解决问题。也许您需要删除debug/release/obj并清除/重建解决方案。

enter image description here


1
由于我的项目引用了一个dll,并且同时具有对相同dll但位于不同文件路径的传递依赖关系,因此遇到了相同的错误。
在构建过程中使用额外的日志记录(工具 -> 选项 -> 构建和运行 -> 输出详细程度为详细或诊断),通过搜索依赖项dll名称来发现它:在任务“Csc”中有两个/引用的dll出现。
解决方法是将引用指向相同的dll路径。

0
在使用Visual Studio中的共享项目时,我遇到了这个错误。 我的共享项目被项目A作为引用包含进来。然后项目B引用了项目A。 我错误地将共享项目添加到了项目B中,导致项目中的每个共享文件都有两个实例。 然后我在一个共享文件中看到了一个字符串扩展方法的错误,该方法是从另一个共享文件中调用的。

0
我创建了一个新的项目,除了'bin'、'references'、'obj'文件夹以外,将所有文件都移动过去,然后妙不可言地工作了。

0

我使用一个数据库工具创建了两个完全相同的类,因为使用了不同的参数执行了两次。我通过类名进行搜索并删除了较新的那个,之后一切都正常了。


0
在我的情况下,我在项目文件夹中有一个名为“publish”的文件夹。删除“publish”文件夹解决了我的问题。

0
在我的情况下,我遇到了同样的问题[单个方法与自身之间的不可能解决的冲突],因为我使用了C# 8.0及其闪亮的新功能来构建三个相互依赖的项目,就像这样:
  • 项目C依赖于项目B。
  • 项目B依赖于项目A。
  • 项目C调用来自继承自项目A类型的项目B中的API。其中一些API具有可空引用类型参数。

此外,我仅为项目A启用了空值检查,而对于项目B和C完全禁用了它。

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

我猜测,这通过确保没有两种完全不同的编译器模式(可空注释开/关)重新处理相同的接口定义来修复了问题,同时构建了两个项目(A和B),然后将相互冲突的空值注释放在它们各自的输出上。


0

我在从.NET 3.1迁移到.NET 6.0时遇到了相同的问题。通过在csproj文件中将引用包“System.Interactive”更新到最新版本(在我的情况下为6.0.1),我解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接