繁体   English   中英

CS0436:类型与导入的类型冲突

[英]CS0436: Type conflicts with the imported type

我使用“添加为链接”选项在多个程序集中包含相同源文件的实例。 我特别需要在这些程序集中包含相同来源的实例,因为它负责必须在程序集内部进行的许可证验证。 跨模块边界执行许可证调用可能会带来安全风险。

我的解决方案中包含该代码的一些项目依赖于也包含该代码的其他模块,从而导致警告CS0436

“[licence.cs 完整路径] 中的类型 [type] 与 [依赖项目还包括 licence.cs] 中的导入类型 [LicenceClass] 冲突。使用 [licence.cs 完整路径] 中定义的类型”。

我曾尝试声明 class 别名,但 licence.cs 内部的定义会导致相同的警告。 在别名中,必须引用重复的 class 名称,这会导致相同的警告。

我知道在程序集之间复制源代码是不好的做法,但在这种情况下是有意的。 我宁愿保留每个程序集链接到的中央实例,而不是保留具有重命名类的专用实例以避免警告。

我的解决方法是使用#pragma忽略警告。 有更优雅的解决方案吗?

值得注意的是,获得此类警告的另一种方法是简单地在 Visual Studio 中设置一个项目来引用自身:参考 -> 解决方案 -> 等等(我如何想出这个 gem 留给读者作为练习...... )

Visual Studio 很乐意遵守,只是在构建期间抛出 OP 所描述类型的警告墙,这是可以预料的(根据反射),因为每个类等都被定义了两次。

唯一发生冲突的时间是两个依赖类包含相同的类。 有两种解决方法:

  1. 在导致 CS0436 的类中禁用警告:

     #pragma warning disable 0436
  2. 有一个单独的类实例,在每个客户端项目中唯一命名(从维护的角度来看是不可取的)。

编辑:还有一个解决方案:按照马克在下面的建议进行操作,并将重复的类标记为internal

当我迁移到 VS2015 时,我有一个从 ASP.NET 3.5 转换为 4.5 的 Web 应用程序。 我开始将此视为警告,但解决方案仍会编译。 没有循环引用,清理解决方案并删除binobj文件夹也无济于事。

事实证明,VS2015 对 App_Code 文件夹中的一些类并不满意。 此处的类与父文件夹中的其余网页具有相同的命名空间。 一旦我将这些类从 App_Code 文件夹移到 Web 应用程序的顶层,警告就消失了。

在 .NET Core 中,您还可以禁用 project.json 中的警告:

{
  "buildOptions":
  {
    "nowarn":
    [
      "CS0436"
    ]
  }
}

我有这个错误,但没有 2 个不同的类!
每个新类都与自身发生冲突,因此显然我遇到了CS0436 Error

经过一番努力,我发现这是我在多人 Unity 项目中使用的Mirror Asset Mirror 以某种方式包含了我创建的每个新类(并从NetworkBehavior继承)。

我的外部编辑器是VSCode (visual studio code,解决方案可能也适用于visual studio)。

解决方案


Edit / Preferences / External tools / "Generate .csproj files for:"
我开始测试不同的设置,这对我有用:
(不确定确切的设置是否适用于所有人,但项目中没有正确的文件会导致此错误。就像我的情况。)

应用这些设置(或适合您的项目的设置)后,单击Regenerate project files并重新启动 Unity 和 VSCode。

我遇到过这样的情况,临时删除一些源文件,稍后再恢复。 碰巧 IDE(在我的例子中是 Rider)试图恢复类,所以当它们丢失时,它只是添加了对生成的 exe 的引用。 显然,当我恢复文件时,它们看起来是重复的。 插入的参考 IDE 看起来像这样,只需将其删除即可修复:

<Reference Include="AppName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
  <HintPath>bin\x86\Debug\AppName.exe</HintPath>
</Reference>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM