警告“Y.cs 中的类型 X 与 Z.dll 中导入的类型 X 冲突”

问题描述 投票:0回答:12

我的项目的 main.cs 返回以下警告:

警告 1 “PATH\Extensions.cs”中的类型“Extensions.MessageDetails”与“path\lib.dll”中导入的类型“Extensions.MessageDetails”冲突。使用“path\Extensions.cs”中定义的类型。 路径\main.cs

我的项目出了什么问题?如何摆脱警告?

我的项目的代码结构如下:

扩展.cs

namespace Extensions
{

    public class MessageDetails
    {
        public string message { get; set; }
        public string link { get; set; }
        public string picture { get; set; }
        public string name { get; set; }
        public string caption { get; set; }
        public string description { get; set; }
        public string userid { get; set; }
        public string username { get; set; }

        public object actions { get; set; }
        public object privacy { get; set; }
        public object targeting { get; set; }
    }

}

lib.dll

namespace MyClassLib {

    public class MyClassLibFoo {
        public void foo(MessageDetails parameters) {
            /* .. */
        }
    }

}

main.cs

using MyClassLib;
using Extensions;

class Program
{
    static void Main(string[] args)
    {
        MessageDetails md = new MessageDetails();
    }
}
c# .net types namespaces
12个回答
70
投票

就我而言,使用 Visual Studio 2013,我发现我的一个类库已开发了对其自身的引用。 我认为当我向我的解决方案添加一个新项目时发生了这种情况,或者它是一个错误,但无论哪种方式,它都会导致这个确切的问题。

检查您的项目参考是否有任何循环引用。


37
投票

看起来

Extensions.cs
都是构建 lib.dll 和你的 main.exe

的项目的一部分

将其从项目之一中删除以解决此问题。


13
投票

我遇到了此类问题,我已从目标 .NET Framework 版本

4.5.2
恢复到
4.0

我的 App_Code 文件夹中的类具有调用该文件夹中其他类中的方法的方法。 当我创建一个名为“AppCode”的标准文件夹并将我的类移入其中时,我不再遇到问题。

如果我重新创建“App_Code”文件夹并将我的类移回其中,我将再次遇到此问题。 我确信这与我的 .NET Framework 版本有关,或者 Visual Studio 在最初构建/针对另一个版本后无法很好地处理更改它。


4
投票

您不能拥有扩展类的两个副本,即使代码相同,它们也不会被视为同一个对象。您的 dll 和主应用程序都需要引用完全相同的 dll。

您可以尝试创建一个“通用文件”类库并向其中添加扩展类,这样您将始终使用正确的类


3
投票

如果您确实需要在两个单独的 dll 中声明或引用这两个类,您可以将您的类标记为

internal

内部类型或成员只能在同一程序集中的文件内访问,因此它将防止冲突。


2
投票

我在一个同样托管在 NuGet 上的项目中遇到了这个问题。我检查了所有项目参考。最后,对象浏览器显示我的 NuGet 包的旧版本的 DLL 以某种方式从 NuGet 缓存文件夹(“C:\Users\{username}\.nuget\packages”)加载到 Visual Studio 中。我从缓存文件夹中删除了该包,它从对象浏览器中消失,一切又恢复正常了。


2
投票

我有一个共享项目“项目 A”,它包含在“项目 B”和“项目 C”中。

“项目 A”已作为共享项目添加到“项目 B”和“项目 C”中。

“项目 A”还包含对“项目 B”的传统引用。

为了纠正该问题,我从“项目 A”中删除了对“项目 B”的引用。


2
投票

在阅读了许多关于SO的答案后,解决方案仍然不清楚。我的情况类似,但解决方案是通过以下方式找到的:

示例项目名称:My.Example.Project

  1. 打开我的项目
  2. 打开参考文献下拉列表
  3. 在参考部分找到 My.Example.Project
  4. 删除对 My.Example.Project 的引用

解决了它!


1
投票

我也遇到过同样的问题。只是一个简单的解决方案。

检查您的项目参考,必须有相同的项目参考。只需删除它,它就会起作用。


1
投票

有时我会收到此错误 - 尽管在我的情况下这是一个错误..我所要做的就是将资源管理器中的文件中的脚本文件名的第一个字母从大写更改为小写/ (或者在我的例子中是在 Unity Engine 中) 然后在我的脚本中相应地更改名称/类。我不知道为什么会发生这种情况.. 只是这样做 - 并且不知道为什么这个修复有效.. 但就我而言,它总是如此。 - 否则,您可能有 2 个相同脚本的副本/2 个差异脚本的相同类名。希望这有帮助。


0
投票

我通过删除目录结构 vs 目录中的 .suo 文件修复了此错误。 停止 vs 然后删除重新启动 vs 对我有用。


0
投票

如果在使用

SharedProject
时出现问题,请确保将所有类型声明为
internal

© www.soinside.com 2019 - 2024. All rights reserved.