네임스페이스를 사용하여 관련된 경고 해결

이 문서에서는 다음과 같은 컴파일러 오류를 다룹니다.

  • 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에 배치해서는 안 됩니다. 이렇게 하면 각각 CS8915CS8914 결과가 나옵니다.

또한 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;
    
  • using 지시문의 unsafe 별칭 또는 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