web-dev-qa-db-ja.com

CS0436:タイプがインポートされたタイプと競合しています

[リンクとして追加]オプションを使用して、同じソースファイルのインスタンスを複数のアセンブリに含めています。これらのアセンブリ内に同じソースのインスタンスを含める必要があるのは、それがアセンブリの内部で発生する必要があるライセンス検証を担当するためです。モジュールの境界を越えてライセンス呼び出しを実行すると、セキュリティリスクが発生する可能性があります。

コードを含む私のソリューションのプロジェクトの一部は、それを含む他のモジュールに依存しているため、警告 CS0436 が発生します。

「[licence.csフルパス]のタイプ[type]は、[licence.csも含む依存関係プロジェクト]のインポートされたタイプ[LicenceClass]と競合します。[licence.csフルパス]で定義されたタイプを使用しています。」.

クラスエイリアスを宣言しようとしましたが、licence.cs内部の定義でも同じ警告が表示されます。エイリアスには、同じ警告を引き起こす重複したクラス名への参照が必要です。

アセンブリ間でソースを複製することは悪い習慣ですが、この場合は意図的なものです。警告を回避するために、名前が変更されたクラスを持つ専用インスタンスではなく、各アセンブリがリンクする中央インスタンスを保持したい。

私が持っている回避策は、#pragmaを使用して警告を無視することです。よりエレガントな解決策はありますか?

23
pdm2011

競合が発生するのは、2つの依存クラスに同じクラスが含まれる場合のみです。 2つの回避策があります。

  1. CS0436を引き起こすクラスの警告を無効にします。

    #pragma warning disable 0436
    
  2. 各クライアントプロジェクトで一意の名前が付けられた、クラスの個別のインスタンスを用意します(メンテナンスの観点からは望ましくありません)。

編集:解決策もあります。Markが以下で提案することを行い、重複するクラスにinternalをマークします。

12
pdm2011

そのような警告を受け取る別の方法は、それ自体を参照するようにVisual Studioでプロジェクトを設定することです:参照->解決策->など(この宝石を理解する方法は、読者への演習として残しています... )

Visual Studioは問題なく準拠します。ビルド中にOPによって記述されたタイプの警告の壁をスローするだけです。これは、すべての単一のクラスなどが2回定義されるため、(リフレクション時に)予想されます。

15
XDS

VS2015に移行したときに、ASP.NET 3.5から4.5に変換したWebアプリケーションがありました。私はこれを警告として見始めましたが、解決策はまだコンパイルされます。循環参照はなく、ソリューションをクリーニングしてbinおよびobjフォルダーを削除しても効果がありませんでした。

VS2015は、App_Codeフォルダー内のいくつかのクラスに満足できなかったことがわかりました。ここのクラスは、親フォルダー内の残りのWebページと同じ名前空間を持っていました。これらのクラスをApp_CodeフォルダーからWebアプリケーションの最上位に移動すると、警告は消えました。

10
Andy S.

.NET Coreでは、project.jsonの警​​告を無効にすることもできます。

{
  "buildOptions":
  {
    "nowarn":
    [
      "CS0436"
    ]
  }
}
1
Simon Mattes