【问题标题】:What horrible thing happens if I ignore CS0436 "type X conflicts with the imported type X" when the same file is included into two projects?当同一个文件包含在两个项目中时,如果我忽略 CS0436“类型 X 与导入的类型 X 冲突”,会发生什么可怕的事情?
【发布时间】:2026-02-24 00:35:02
【问题描述】:

我有一个类似于this one 的设置 - 同一个 .cs 文件包含在多个项目中(从技术上讲,它驻留在项目中,并且在另一个项目中添加了一个快捷方式,因此始终有一个文件副本) 然后其中一个项目被另一个项目引用,我收到type X conflicts with the imported type X 警告。我知道我可以通过 crafting a class library referenced from both projects 解决这个问题,但我现在宁愿避免这种额外的工作。

在这种情况下忽略警告是否安全?会发生什么坏事?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    这两种类型不能互换。您可以分别拥有两个声明,但它们将是完全独立的类型。类型解析可能真的很尴尬 - 特别是如果 extern 别名是不可能的。如果他们从不离开调用范围,那可能没问题。但是,在一般情况下,这不是一个好主意,应该避免。运行时类型不匹配的可能性很大,编译时类型解析失败也是如此。

    另一个选项将来可能是assembly neutral types;除非编译器框架处理它,否则这不适用——据我所知,它可能仅限于 asp.net mvc 堆栈,但 理论上

    [AssemblyNeutral, AttributeUsage(AttributeTargets.Class
        | AttributeTargets.Interface | AttributeTargets.Struct,
        AllowMultiple = false, Inherited = false)]
    internal sealed class AssemblyNeutralAttribute : Attribute { }
    

    然后在你的类型上敲[AssemblyNeutral]

    【讨论】:

      【解决方案2】:

      找到这个:

      您已添加对项目输出的引用。

      换句话说,在尝试编译您的项目 AriaLibrary 时, 生成 AriaLibrary.exe,编译器导入程序集 AriaLibrary.exe。在磁盘上,此文件存在于以前的构建中。

      因此,编译器会找到两个该类,一个它试图 现在编译,从以前的版本中编译,这样你就得到了 警告。

      由于没有正当理由将项目输出 作为对自身的引用导入,您可以安全地删除它 参考。

      这里:The type 'x' in 'x.cs' conflicts with the imported type 'x'

      但在回答您的实际问题时,我(猜测)您可能会遇到碰撞/等问题并因此形成运行时错误?

      【讨论】:

        最近更新 更多