네임스페이스를 사용하여 관련된 경고 해결
이 문서에서는 다음과 같은 컴파일러 오류를 다룹니다.
- CS0138: 오류: using 네임스페이스 지시문은 네임스페이스에만 적용할 수 있습니다. 'type'은 네임스페이스가 아닌 형식입니다.
- CS0431: 오류: 별칭이 형식을 참조하기 때문에
::
와 함께 별칭 '식별자'를 사용할 수 없습니다. 대신.
(을)를 사용합니다. - CS0432: 오류: 별칭 '식별자'를 찾을 수 없습니다.
- CS0576: 오류: 네임스페이스 '네임스페이스'에는 별칭 'identifier'와 충돌하는 정의가 포함되어 있습니다.
- CS0687: 오류: 네임스페이스 별칭 한정자
::
(은)는 항상 형식 또는 네임스페이스로 확인되므로 여기서는 불법입니다. 대신.
을(를) 사용하는 것이 좋습니다. - CS1529: 오류: using 절은 extern 별칭 선언을 제외한 네임스페이스에 정의된 다른 모든 요소 앞에 있어야 합니다.
- CS1537: 오류: 사용 별칭 '별칭'이 이 네임스페이스에 이전에 나타났습니다.
- CS7000: 오류: 별칭이 지정된 이름을 예기치 않게 사용했습니다.
- CS7007: 오류:
using static
지시문은 형식에만 적용할 수 있습니다. 대신using namespace
지시문을 고려 - CS8083: 오류: 별칭으로 한정된 이름이 식이 아닙니다.
- CS8085: 오류: 'using static' 지시문을 사용하여 별칭을 선언할 수 없습니다.
- CS8914: 오류: 전역 using 지시문을 네임스페이스 선언에 사용할 수 없습니다.
- CS8915: 오류: 전역 using 지시문은 전역이 아닌 모든 using 지시문 앞에 있어야 합니다.
- CS9055: 오류: '정적을 사용하는 전역' 지시문에서 파일 로컬 형식을 사용할 수 없습니다.
- CS9130: 오류: 별칭 사용은
ref
형식일 수 없습니다. - CS9131: 오류: 사용 별칭만
unsafe
수 있습니다. - CS9132: 오류: 별칭을 사용하는 것은 nullable 참조 형식일 수 없습니다.
- CS9133: 오류:
static
한정자는unsafe
한정자 앞에 있어야 합니다. - CS9162: 형식은 '정적 사용'에 유효하지 않습니다. 클래스, 구조체, 인터페이스, 열거형, 대리자 또는 네임스페이스만 사용할 수 있습니다.
그리고 다음 컴파일러 경고:
- CS0105: 경고: '네임스페이스'에 대한 using 지시문이 이 네임스페이스에 이전에 나타났습니다.
- CS0440: 경고:
global::
항상 별칭이 아닌 전역 네임스페이스를 참조하기 때문에global
(으)로 명명된 별칭을 정의하는 것은 좋지 않습니다. - CS8019: 정보: 지시문을 사용할 필요가 없습니다.
- CS8933: 정보: using 지시문은 이전에 전역 using으로 나타났습니다.
이러한 오류 및 경고는 using
지시문이 올바르게 구성되지 않았다는 것을 나타냅니다. 다음 섹션에서는 이러한 오류와 오류를 수정하는 방법에 대해 설명합니다.
using 지시문
using
지시문은 namespace
선언의 다른 요소보다 먼저 또는 파일의 namespace
선언 앞에 있어야 합니다. 파일의 뒷부분에 using
지시문을 배치하면 컴파일러에서 CS1529 오류가 발생합니다.
namespace UsingDirective;
public class MyClass
{
}
using System.Text.Json; // CS1529
이 문제를 해결하려면 파일의 맨 위 또는 네임스페이스의 맨 위로 using
선언을 이동합니다.
using System.Text.Json;
namespace UsingDirective;
public class MyClass
{
}
컴파일러는 using
또는 global using
지시문의 중복 using
지시문에 대한 CS8933,CS0105 또는 진단 CS8019 경고를 생성합니다. 중복 항목을 제거할 수 있습니다.
using
지시문의 static
, global
또는 unsafe
한정자와 using
지시문을 잘못 결합하는 내용은 이 문서의 뒷부분에서 설명합니다.
정적 지시문 사용
using static
지시문은 한 형식의 멤버를 현재 네임스페이스로 가져옵니다. 다음 예제에서는 WriteLine
같은 System.Console
메서드를 현재 네임스페이스로 가져옵니다.
using static System.Console;
컴파일러는 static
한정자를 생략하면 CS0138을 생성합니다.
using System.Console; // CS0138
형식 대신 네임스페이스를 가져오는 static
한정자를 포함하는 경우 컴파일러는CS7007(을)를 생성합니다.
using static System; // CS7007
기호가 적절한 형식 중 하나가 아닌 경우 컴파일러는 CS9162를 내보냅니다.
static
한정자를 using
지시문의 unsafe
한정자와 결합하면 static
한정자가 먼저 와야 합니다.
using static unsafe UnsafeExamples.UnsafeType;
전역 using 지시문
global using
지시문은 현재 프로젝트의 모든 소스 파일에서 네임스페이스 또는 형식을 가져옵니다.
global using System.Text;
모든 global using
지시문은 해당 소스 파일의 전역이 아닌 using
지시문 앞에 와야 하며 namespace
에 배치해서는 안 됩니다. 이렇게 하면 각각 CS8915 및 CS8914 결과가 나옵니다.
또한 static global using
지시문은 파일-로컬 형식을 참조할 수 없습니다.
별칭 한정자
별칭 한정자 ::
, 네임스페이스 별칭 앞에 오거나 global
별칭을 따릅니다. .
(을)를 사용하여 정규화된 이름의 요소를 구분해야 하는 ::
(을)를 사용하는 경우 컴파일러는 CS0431, CS0432, CS0687, *CS7000 또는 CS8083중 하나를 내보냅니다.
모든 경우에 ::
(을)를 .
구분 기호로 바꿉니다.
또한 global
(으)로 명명된 별칭을 정의하는 경우 컴파일러는 CS0440 문제를 발생합니다. global
별칭은 항상 전역 네임스페이스를 참조합니다. 별칭을 선언하는 것은 작동하지 않으며 별칭에 대해 다른 이름을 선택해야 합니다.
별칭 이름 충돌
지시문을 사용하여 네임스페이스 또는 형식에 별칭을 선언할 using
수 있습니다.
using JSON = System.Text.Json;
using ValueMap = System.Collections.Generic.Dictionary<string, decimal>;
using TimedData = (System.DateTime timeRecorded, decimal value);
앞의 예제에서 =
로그인의 왼쪽에 있는 별칭에 대한 고유한 이름을 만들어야 합니다. 형식(예: Object
) 또는 네임스페이스(System
)에 이미 매핑된 이름을 사용하면 CS0576 또는 CS1537을 발생시킬 수 있습니다.
별칭 사용에 대한 제한 사항
C# 12 이전에는 언어에서 형식 선언에 대한 별칭을 만드는 using
지시문에 다음 제한을 적용했습니다.
using static
지시문을 사용하여 별칭을 만들 수 없습니다.using static con = System.Console; using static unsafe ip = int*;
C# 12부터는 다음과 같은 제한 사항이 도입됩니다.
using 별칭에는
in
,ref
또는out
한정자를 사용할 수 없습니다.// All these are invalid using RefInt = ref int; using OutInt = out int; using InInt = in int;
지시문은
unsafe using
별칭 또는static using
다음을 지정해야 합니다.// Elsewhere: public namespace UnsafeExamples { public unsafe static class UnsafeType { // ... } } // Using directives: using unsafe IntPointer = int*; using static unsafe UnsafeExamples.UnsafeType; using unsafe UnsafeExamples; // not allowed
nullable 참조 형식에 대한 별칭은 만들 수 없습니다.
using NullableInt = System.Int32?; // Allowed using NullableString = System.String?; // Not allowed
.NET