TypeName1 형식은 TypeName2 및 TypeName3 모두에 있습니다.
애플리케이션에서 참조되는 두 개의 서로 다른 어셈블리에는 동일한 네임스페이스와 형식이 포함되어 있어 모호성이 발생합니다.
이 오류를 해결하려면 프로젝트 참조 별칭과 함께 extern alias 기능을 사용하거나 어셈블리 중 하나를 참조하지 마세요. C# 컴파일러를 사용하여 직접 컴파일할 때 (참조) 컴파일러 옵션의 별칭 기능을 사용할 수도 있습니다.
이 오류는 다음과 같은 경우에도 발생할 수 있습니다.
- 지시문에는
@ PageCodeFile특성이 있는데, 이는CodeBehind특성이어야 합니다. - 코드는 상주해서는 안 되는 App_Code 폴더에 배치됩니다.
충돌하는 어셈블리를 식별하는 방법
전체 오류 메시지는 충돌하는 형식을 포함하는 어셈블리를 보여줍니다. 메시지 형식은 다음과 같습니다.
error CS0433: The type 'N.C' exists in both 'A, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' and 'B, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'
이 예제에서 충돌하는 어셈블리는 A 와 B입니다. 어셈블리 이름은 버전 정보 앞에 작은따옴표로 표시됩니다. 이러한 어셈블리 이름을 사용하여 충돌을 일으키는 참조를 확인하고 해결 방법을 결정합니다.
예시
이 코드는 모호한 형식의 첫 번째 복사본을 사용하여 DLL을 만듭니다.
// CS0433_1.cs in CS0433_1.csproj
// compile with: dotnet build or /target:library
namespace TypeBindConflicts
{
public class AggPubImpAggPubImp { }
}
이 코드는 모호한 형식의 두 번째 복사본을 사용하여 DLL을 만듭니다.
// CS0433_2.cs in CS0433_2.csproj
// compile with: dotnet build or /target:library
namespace TypeBindConflicts
{
public class AggPubImpAggPubImp { }
}
따라서 프로젝트에서 이러한 두 라이브러리(CS0433_1.dll 및 CS0433_2.dll)를 사용할 때 형식을 AggPubImpAggPubImp 사용하는 것이 모호하고 컴파일러 오류가 CS0433발생합니다.
<!-- CS0433_3.csproj -->
<ProjectReference Include="..\CS0433_1\CS0433_1.csproj" />
<ProjectReference Include="..\CS0433_2\CS0433_2.csproj" />
// CS0433_3.cs in CS0433_3.csproj
// compile with: dotnet build or /reference:cs0433_1.dll /reference:cs0433_2.dll
using TypeBindConflicts;
public class Test
{
public static void Main()
{
AggPubImpAggPubImp n6 = new AggPubImpAggPubImp(); // CS0433
}
}
다음 예제에서는 이 기능을 프로젝트 참조와 함께 사용하여 extern alias 이 CS0433 오류를 해결하는 방법을 보여 줍니다. 최신 .NET 프로젝트에 권장되는 방법입니다.
1단계: 프로젝트 참조 중 하나에 별칭 추가
먼저 충돌하는 프로젝트 참조 중 하나에 별칭을 추가하도록 프로젝트 파일을 수정합니다.
<!-- CS0433_4.csproj -->
<ProjectReference Include="..\CS0433_1\CS0433_1.csproj">
<Aliases>CustomTypes</Aliases>
</ProjectReference>
<ProjectReference Include="..\CS0433_2\CS0433_2.csproj" />
2단계: 코드에서 extern 별칭 사용
그런 다음 지시문과 정규화된 형식 이름을 사용하여 extern alias 두 형식을 구분합니다.
// CS0433_4.cs in CS0433_4.csproj
// compile with: dotnet build or /reference:cs0433_1.dll /reference:CustomTypes=cs0433_2.dll
extern alias CustomTypes;
using TypeBindConflicts;
public class Test
{
public static void Main()
{
// AggPubImpAggPubImp taken from CS0433_2.dll (no alias, default global namespace)
AggPubImpAggPubImp n6 = new AggPubImpAggPubImp();
// AggPubImpAggPubImp taken from CS0433_1.dll (via CustomTypes alias)
CustomTypes.TypeBindConflicts.AggPubImpAggPubImp n7 =
new CustomTypes.TypeBindConflicts.AggPubImpAggPubImp();
}
}
.NET