Share via


참조 매개 변수, 변수 및 반환과 관련된 오류 및 경고

참조 변수를 작업할 때 다음 오류가 생성될 수 있습니다.

  • CS0192: readonly 필드를 ref 또는 out 값으로 사용할 수 없습니다(생성자 제외).
  • CS0199: static readonly 필드를 ref 또는 out 값으로 사용할 수 없습니다(정적 생성자 제외).
  • CS0206: 참조를 반환하지 않는 속성 또는 인덱서는 out 또는 ref 값으로 사용할 수 없습니다.
  • CS0631: 이 컨텍스트에서는 refout을(를) 사용할 수 없습니다.
  • CS0767: 지정한 형식 매개 변수가 있는 인터페이스를 사용하면 메서드에 refout만 다른 오버로드가 포함되므로 해당 인터페이스를 상속할 수 없습니다.
  • CS1510: ref 또는 out 값은 할당 가능한 변수여야 합니다.
  • CS1605: 읽기 전용이므로 변수를 ref 또는 out 값으로 사용할 수 없습니다.
  • CS1623: 반복기에는 ref, in 또는 out 매개 변수를 사용할 수 없습니다.
  • CS1649: readonly 필드의 멤버는 ref 또는 out 값으로 사용할 수 없습니다(생성자 제외).
  • CS1651: 정적 읽기 전용 필드는 ref 또는 out 값으로 사용할 수 없습니다(정적 생성자 제외).
  • CS1655: 형식 필드를 ref 또는 out 값으로 사용할 수 없습니다.
  • CS1657: 변수를 ref 또는 out 값으로 사용할 수 없습니다.
  • CS1741: ref 또는 out 매개 변수에는 기본값을 사용할 수 없습니다.
  • CS1939: 범위 변수를 out 또는 ref 매개 변수로 전달할 수 없습니다.
  • CS1988: 비동기 메서드에는 ref, in 또는 out 매개 변수를 사용할 수 없습니다.
  • CS7084: Windows 런타임 이벤트를 out 또는 ref 매개 변수로 전달할 수 없습니다.
  • CS8166: ref 매개 변수가 아니므로 참조로 매개 변수를 반환할 수 없습니다.
  • CS8167: 매개 변수의 멤버는 ref 또는 out 매개 변수가 아니므로 참조로 반환할 수 없습니다.
  • CS8168: 로컬은 ref 로컬이 아니므로 참조로 반환할 수 없습니다.
  • CS8169: ref 로컬이 아니므로 참조로 지역 변수의 멤버를 반환할 수 없습니다.
  • CS8196: 동일한 인수 목록에서 암시적으로 형식화된 out 변수에 대한 참조는 허용되지 않습니다.
  • CS8325: ref 조건 연산자를 포함하는 식에는 'await'을(를) 사용할 수 없습니다.
  • CS8326: 두 조건 연산자 값이 모두 ref 값이거나 모두 ref 값이 아니어야 합니다.
  • CS8327: 대체 ref 값과 일치하려면 식이 올바른 형식이어야 합니다.
  • CS8329: 읽기 전용 변수이므로 변수를 ref 또는 out 값으로 사용할 수 없습니다.
  • CS8330: 변수 멤버는 읽기 전용 변수이므로 ref 또는 out 값으로 사용할 수 없습니다.
  • CS8331: 읽기 전용 변수이므로 변수에 할당하거나 ref 할당의 오른쪽으로 사용할 수 없습니다.
  • CS8332: 읽기 전용 변수이므로 변수의 멤버에 할당하거나 ref 할당의 오른쪽으로 사용할 수 없습니다.
  • CS8337: 'ref' 확장 메서드의 첫 번째 매개 변수는 값 형식이거나 구조체의 제약을 받는 제네릭 형식이어야 합니다.
  • CS8338: 확장 메서드의 첫 번째 'in' 또는 'ref readonly' 매개 변수는 제네릭이 아닌 구체적인 값 형식이어야 합니다.
  • CS8345: 필드 또는 자동 구현 속성은 ref struct의 인스턴스 멤버인 경우 외에는 형식일 수 없습니다.
  • CS8351: ref 조건 연산자의 분기는 호환되지 않는 선언 범위가 포함된 변수를 참조할 수 없습니다.
  • CS8373: ref 할당의 왼쪽은 ref 변수여야 합니다.
  • CS8374: 대상보다 더 좁은 이스케이프 범위를 가진 원본을 ref-assign할 수 없습니다.
  • CS8388: out 변수는 ref 로컬로 선언할 수 없습니다.
  • CS8977: UnmanagedCallersOnly'로 특성이 지정된 메서드의 서명에서 'ref', 'in' 또는 'out'을(를) 사용할 수 없습니다.
  • CS9072: 분해 변수는 ref 로컬로 선언할 수 없습니다.
  • CS9077: ref 매개 변수를 통해 참조로 매개 변수를 반환할 수 없으며, return 문에서만 반환될 수 있습니다.
  • CS9078: ref 매개 변수를 통해 참조로 매개 변수의 구성원을 반환할 수 없으며, return 문에서만 반환될 수 있습니다.
  • CS9079: 원본은 return 문을 통해서만 현재 메서드를 이스케이프할 수 있기 때문에 ref-assign할 수 없습니다.
  • CS9096: 원본이 대상보다 더 넓은 이스케이프 범위 값을 가져 대상보다 더 좁은 이스케이프 범위 값을 가진 원본을 통해 할당할 수 있기 때문에 ref-assign할 수 없습니다.
  • CS9101: UnscopedRefAttribute는 구조체 인스턴스 메서드 및 속성에만 적용할 수 있으며 생성자 또는 초기화 전용 멤버에는 적용할 수 없습니다.
  • CS9102: UnscopedRefAttribute는 인터페이스 구현에 적용할 수 없습니다.
  • CS9104: 형식의 using 문 리소스는 비동기 메서드 또는 비동기 람다 식에서 사용할 수 없습니다.
  • CS9190: readonly 한정자는 ref 다음에 지정해야 합니다.
  • CS9199: ref readonly 매개 변수에는 Out 특성을 사용할 수 없습니다.

참조 변수가 잘못 사용될 때 다음 경고가 생성됩니다.

  • CS9085: 변수를 ref-assign하지만 대상은 원본보다 좁은 이스케이프 범위를 가집니다.
  • CS9086: ref 조건부 연산자의 분기는 선언 범위가 호환되지 않는 변수를 참조합니다.
  • CS9087: 참조로 매개 변수를 반환하지만 ref 매개 변수가 아닙니다.
  • CS9089: ref또는 out 매개 변수가 아닌 매개 변수의 멤버를 참조로 반환합니다.
  • CS9091: 참조로 로컬을 반환하지만 ref 로컬이 아닙니다.
  • CS9092: 참조로 로컬의 멤버를 반환하지만 ref 로컬이 아닙니다.
  • CS9093: ref-assign하지만 원본은 return 문을 통해서만 현재 메서드를 이스케이프할 수 있습니다.
  • CS9094: ref 매개 변수를 통해 참조로 매개 변수를 반환하지만 return 문에서만 안전하게 반환될 수 있습니다.
  • CS9095: ref 매개 변수를 통해 참조로 매개 변수의 멤버를 반환하지만 return 문에서만 안전하게 반환될 수 있습니다.
  • CS9097: ref-assign할 수 있지만 원본이 대상보다 더 넓은 이스케이프 범위 값을 가져 원본보다 더 좁은 이스케이프 범위 값을 가진 대상을 통해 할당할 수 있습니다.
  • CS9191: in 매개 변수에 해당하는 인수의 ref 한정자는 in과(와) 동일합니다. in을(를) 대신 사용하는 것이 좋습니다.
  • CS9192: 인수는 ref 또는 in 키워드와 함께 전달해야 합니다.
  • CS9193: 인수는 ref readonly 매개 변수에 전달되므로 변수여야 합니다.
  • CS9195: 인수는 in 키워드와 함께 전달해야 합니다.
  • CS9196: 매개 변수의 참조 종류 한정자가 재정의 또는 구현된 멤버의 해당 매개 변수와 일치하지 않습니다.
  • CS9197: 매개 변수의 참조 종류 한정자가 숨겨진 멤버의 해당 매개 변수와 일치하지 않습니다.
  • CS9198: 매개 변수의 참조 종류 한정자가 대상의 해당 매개 변수와 일치하지 않습니다.
  • CS9200: 기본값이 ref readonly 매개 변수에 대해 지정되지만 ref readonly은(는) 참조에만 사용해야 합니다. 매개 변수를 in(으)로 선언하는 것이 좋습니다.
  • CS9201: ref 필드는 사용하기 전에 ref-assigne해야 합니다.

다음 오류 및 경고는 다음 테마를 따릅니다.

이 문서에서는 참조 변수라는 용어를 in, ref readonly, ref 또는 out 한정자 중 하나로 선언된 매개 변수, 또는 ref 지역 변수, ref structref 필드 또는 ref 반환을 설명하는 일반 용어로 사용합니다. 참조 변수가 참조 항목이라는 또 다른 변수를 참조합니다.

잘못된 구문

다음 오류는 참조 변수와 관련하여 잘못된 구문을 사용하고 있음을 나타냅니다.

  • CS8373: ref 할당의 왼쪽은 ref 변수여야 합니다.
  • CS8388: out 변수는 ref 로컬로 선언할 수 없습니다.
  • CS9190: readonly 한정자는 ref 다음에 지정해야 합니다.

다음 변경 중 하나로 오류를 수정할 수 있습니다.

  • = ref 연산자의 왼쪽 피연산자는 참조 변수여야 합니다. 올바른 구문에 대한 자세한 내용은 참조 변수를 참조하세요.
  • 매개 변수 한정자 ref readonly이(가) 이 순서여야 합니다. readonly ref이(가) 법적 매개 변수 한정자가 아닙니다. 단어의 순서를 바꿉니다.
  • 지역 변수는 out(으)로 선언할 수 없습니다. 로컬 참조 변수를 선언하는 데 ref을(를) 사용합니다.

참조 변수 제한 사항

다음 오류는 참조 변수를 가진 경우 참조 변수를 사용할 수 없음을 나타냅니다.

  • CS0631: 이 컨텍스트에서는 refout을(를) 사용할 수 없습니다.
  • CS0767: 지정한 형식 매개 변수가 있는 인터페이스를 사용하면 메서드에 refout만 다른 오버로드가 포함되므로 해당 인터페이스를 상속할 수 없습니다.
  • CS1623: 반복기에는 ref, in 또는 out 매개 변수를 사용할 수 없습니다.
  • CS1741: ref 또는 out 매개 변수에는 기본값을 사용할 수 없습니다.
  • CS1939: 범위 변수를 out 또는 ref 매개 변수로 전달할 수 없습니다.
  • CS1988: 비동기 메서드에는 ref, in 또는 out 매개 변수를 사용할 수 없습니다.
  • CS7084: Windows 런타임 이벤트를 out 또는 ref 매개 변수로 전달할 수 없습니다.
  • CS8196: 동일한 인수 목록에서 암시적으로 형식화된 out 변수에 대한 참조는 허용되지 않습니다.
  • CS8325:ref 조건 연산자를 포함하는 식에는 'await'를 사용할 수 없습니다.
  • CS8326: 두 조건 연산자 값이 모두 ref 값이거나 모두 ref 값이 아니어야 합니다.
  • CS8327: 대체 ref 값과 일치하려면 식이 올바른 형식이어야 합니다.
  • CS8337: 'ref' 확장 메서드의 첫 번째 매개 변수는 값 형식이거나 구조체의 제약을 받는 제네릭 형식이어야 합니다.
  • CS8338: 확장 메서드의 첫 번째 'in' 또는 'ref readonly' 매개 변수는 제네릭이 아닌 구체적인 값 형식이어야 합니다.
  • CS8977: UnmanagedCallersOnly'로 특성이 지정된 메서드의 서명에서 'ref', 'in' 또는 'out'을(를) 사용할 수 없습니다.
  • CS9072: 분해 변수는 ref 로컬로 선언할 수 없습니다.
  • CS9104: 형식의 using 문 리소스는 비동기 메서드 또는 비동기 람다 식에서 사용할 수 없습니다.
  • CS9199: ref readonly 매개 변수에는 Out 특성을 사용할 수 없습니다.

다음 경고는 참조 변수가 사용되어서는 안 되며, 안전하지 않을 수 있음을 나타냅니다.

  • CS9196: 매개 변수의 참조 종류 한정자가 재정의 또는 구현된 멤버의 해당 매개 변수와 일치하지 않습니다.
  • CS9197: 매개 변수의 참조 종류 한정자가 숨겨진 멤버의 해당 매개 변수와 일치하지 않습니다.
  • CS9198: 매개 변수의 참조 종류 한정자가 대상의 해당 매개 변수와 일치하지 않습니다.
  • CS9200: 기본값이 ref readonly 매개 변수에 대해 지정되지만 ref readonly은(는) 참조에만 사용해야 합니다. 매개 변수를 in(으)로 선언하는 것이 좋습니다.
  • CS9201: ref 필드는 사용하기 전에 ref-assigne해야 합니다.

오류를 해결하려면 허용되지 않는 참조 변수를 제거합니다.

  • 인덱서, 반복기비동기 메서드에서 in, refout 매개 변수를 제거합니다.
  • await를 포함하는 ref 조건식(? :)을 제거합니다.
  • 형식이 값 형식이 아니거나 값 형식으로 제한되는 제네릭 형식이 아닌 확장 메서드의 첫 번째 매개 변수에서 ref 한정자를 제거합니다.
  • 두 [조건부 연산자 식] 모두가 ref 변수이거나 모두 아니어야 합니다. 한 식에서 ref을(를) 제거하거나, 다른 식에 이를 추가합니다. ref 조건식인 경우 두 식 모두 동일한 형식이어야 합니다.
  • refout 메서드 매개 변수는 기본값을 가질 수 없습니다. ref 또는 out 한정자를 제거하거나 기본값을 제거합니다.
  • 암시적으로 형식화된 out 변수 선언은 동일한 인수 목록에서 다른 곳에 나타날 수 없습니다.
  • async 메서드 람다 식에서는 using 문에 참조 변수를 넣을 수 없습니다.
  • LINQ 쿼리 식의 범위 변수는 참조로 전달할 수 없습니다.
  • 개체를 참조 변수로 분해할 수 없습니다. 참조 변수를 값 변수로 바꿉니다.
  • 메서드 오버로드가 refout에서만 다른 다중 인터페이스를 구현할 수 없습니다. 예를 들어 한 인터페이스는 void M(ref int i)을(를) 선언하고 다른 인터페이스는 void M(out int i)을(를) 선언합니다. 메서드를 구분할 수 없기 때문에 클래스가 두 인터페이스를 모두 구현할 수는 없습니다. 두 인터페이스 중 하나만 구현할 수 있습니다.
  • System.Runtime.InteropServices.UnmanagedCallersOnlyAttribute(으)로 특성이 지정된 메서드는 참조 매개 변수를 사용할 수 없습니다.
  • Windows 런타임 이벤트는 참조 변수로 전달할 수 없습니다.
  • ref readonly 매개 변수는 원격 API에서 System.Runtime.InteropServices.OutAttribute을(를) 적용할 수 없습니다.

unscoped ref 제한 사항

ref 매개 변수의 unscoped 한정자는 일부 위치에서 허용되지 않습니다.

  • CS9101: UnscopedRefAttribute는 구조체 인스턴스 메서드 및 속성에만 적용할 수 있으며 생성자 또는 초기화 전용 멤버에는 적용할 수 없습니다.
  • CS9102: UnscopedRefAttribute는 인터페이스 구현에 적용할 수 없습니다.

오류를 발생시킨 매개 변수 선언에서 unscoped 한정자를 제거해야 합니다.

참조 변수에 참조 항목 필요

변수를 참조 매개 변수, 참조 반환 또는 ref 로컬 할당에 대한 인수로 제공해야 합니다.

  • CS0206: 참조를 반환하지 않는 속성 또는 인덱서는 out 또는 ref 값으로 사용할 수 없습니다.
  • CS1510: ref 또는 out 값은 할당 가능한 변수여야 합니다.

경고:

  • CS9191: ref매개 변수에 해당하는 인수의 in 한정자는 in과(와) 동일합니다. 대신 in을(를) 사용하는 것이 좋습니다.
  • CS9192: 인수는 ref 또는 in 키워드와 함께 전달해야 합니다.
  • CS9193: 인수는 ref readonly 매개 변수에 전달되므로 변수여야 합니다.
  • CS9195: 인수는 in 키워드와 함께 전달해야 합니다.

컴파일러는 변수를 사용해야 하는 값을 계산하는 식을 사용할 때 다음 오류를 내보냅니다. 해당 식의 결과를 사용하려면 변수에 저장해야 합니다. 예를 들어 속성 및 인덱서는 변수가 아닌, 값을 반환합니다. 결과를 변수에 저장하고 해당 변수에 대한 참조를 전달해야 합니다.

쓰기 가능 참조 변수에 쓰기 가능 참조 항목 필요

쓰기 가능 참조 변수를 사용하려면 참조 항목도 쓰기 가능해야 합니다. 다음 오류는 변수가 쓰기 가능하지 않음을 나타냅니다.

  • CS0192: readonly 필드를 ref 또는 out 값으로 사용할 수 없습니다(생성자 제외).
  • CS0199: static readonly 필드를 ref 또는 out 값으로 사용할 수 없습니다(정적 생성자 제외).
  • CS1605: 읽기 전용이므로 변수를 ref 또는 out 값으로 사용할 수 없습니다.
  • CS1649: readonly 필드의 멤버는 ref 또는 out 값으로 사용할 수 없습니다(생성자 제외).
  • CS1651: static readonly 필드의 필드는 ref 또는 out 값으로 사용할 수 없습니다(정적 생성자 제외).
  • CS1655: 형식 필드를 ref 또는 out 값으로 사용할 수 없습니다.
  • CS1657: 변수를 ref 또는 out 값으로 사용할 수 없습니다.
  • CS8329: 읽기 전용 변수이므로 변수를 ref 또는 out 값으로 사용할 수 없습니다.
  • CS8330: 변수 멤버는 읽기 전용 변수이므로 ref 또는 out 값으로 사용할 수 없습니다.
  • CS8331: 읽기 전용 변수이므로 변수에 할당하거나 ref 할당의 오른쪽으로 사용할 수 없습니다.
  • CS8332: 읽기 전용 변수이므로 변수의 멤버에 할당하거나 ref 할당의 오른쪽으로 사용할 수 없습니다.

쓰기 가능이 아닌 변수의 예는 다음과 같습니다.

  • 읽기 전용 필드(인스턴스와 정적 필드 둘 다).
  • readonly 필드의 멤버.
  • this 변수.
  • foreach 반복 변수.
  • using 변수 또는 고정 변수.

값을 복사하고 복사본에 대한 참조를 전달해야 합니다.

ref 안전 위반

컴파일러는 참조 항목 및 참조 변수의 안전한 컨텍스트를 추적합니다. 컴파일러는 참조 변수가 더 이상 유효하지 않은 참조 변수를 참조하는 경우 안전하지 않은 코드에서 오류 또는 경고를 발생합니다. 참조에는 최소한 참조 변수의 ref 안전 컨텍스트만큼 넓은 안전 컨텍스트가 있어야 합니다. 이러한 안전 검사 위반하면 참조 변수가 참조 항목 변수 대신 임의 메모리에 액세스합니다.

  • CS8166: ref 참조 매개 변수가 아니므로 참조로 매개 변수를 반환할 수 없습니다.
  • CS8167: 매개 변수의 멤버는 ref 또는 out 매개 변수가 아니므로 참조로 반환할 수 없습니다.
  • CS8168: 로컬은 ref 로컬이 아니므로 참조로 반환할 수 없습니다.
  • CS8169: ref 로컬이 아니므로 참조로 지역 변수의 멤버를 반환할 수 없습니다.
  • CS8345: 필드 또는 자동 구현 속성은 ref struct의 인스턴스 멤버인 경우 외에는 형식일 수 없습니다.
  • CS8351: ref조건 연산자의 분기는 호환되지 않는 선언 범위가 포함된 변수를 참조할 수 없습니다.
  • CS8374: 대상보다 더 좁은 이스케이프 범위를 가진 원본을 ref-assign할 수 없습니다.
  • CS9077: ref매개 변수를 통해 참조로 매개 변수를 반환할 수 없으며, return 문에서만 반환될 수 있습니다.
  • CS9078: ref매개 변수를 통해 참조로 매개 변수의 구성원을 반환할 수 없으며, return 문에서만 반환될 수 있습니다.
  • CS9079: 원본은 return 문을 통해서만 현재 메서드를 이스케이프할 수 있기 때문에 ref-assign할 수 없습니다.
  • CS9096: 원본이 대상보다 더 넓은 이스케이프 범위 값을 가져 원본보다 더 좁은 이스케이프 범위 값을 가진 대상을 통해 할당할 수 있기 때문에 원본을 대상에 ref-assign할 수 없습니다.

경고:

  • CS9085: 변수를 ref-assign하지만 대상은 원본보다 좁은 이스케이프 범위를 가집니다.
  • CS9086: ref 조건부 연산자의 분기는 선언 범위가 호환되지 않는 변수를 참조합니다.
  • CS9087: 참조로 매개 변수를 반환하지만 ref 매개 변수가 아닙니다.
  • CS9089: ref또는 out 매개 변수가 아닌 매개 변수의 멤버를 참조로 반환합니다.
  • CS9091: 참조로 로컬을 반환하지만 ref 로컬이 아닙니다.
  • CS9092: 참조로 로컬의 멤버를 반환하지만 ref 로컬이 아닙니다.
  • CS9093: ref-assign하지만 원본은 return 문을 통해서만 현재 메서드를 이스케이프할 수 있습니다.
  • CS9094: ref매개 변수를 통해 참조로 매개 변수를 반환하지만 return 문에서만 안전하게 반환될 수 있습니다.
  • CS9095: ref매개 변수를 통해 참조로 매개 변수의 멤버를 반환하지만 return 문에서만 안전하게 반환될 수 있습니다.
  • CS9097: ref-assign할 수 있지만 원본이 대상보다 더 넓은 이스케이프 범위 값을 가져 원본보다 더 좁은 이스케이프 범위 값을 가진 대상을 통해 할당할 수 있습니다.

컴파일러는 정적 분석을 사용하여 참조 변수를 사용할 수 있는 모든 지점에서 참조 항목이 유효한지 확인합니다. 참조 변수가 참조할 수 있는 모든 위치에서 참조 항목이 유효한 상태로 유지되도록 코드를 리팩터링해야 합니다. ref 안전 규칙에 대한 자세한 내용은 ref 안전 컨텍스트에 대한 C# 표준을 참조하세요.