문 및 반복기 메서드와 관련된 yield return에는 여러 가지가 있습니다.
- CS1622: 반복기에서 값을 반환할 수 없습니다. yield return 문을 사용하여 값을 반환하거나 yield break 문을 사용하여 반복을 끝내세요.
- CS1624: 'type'이 반복기 인터페이스 형식이 아니므로 'accessor'의 본문은 반복기 블록이 될 수 없습니다.
- CS1625: finally 절의 본문에서는 yield를 사용할 수 없습니다.
- CS1626: catch 절이 포함된 try 블록의 본문에서는 값을 생성할 수 없습니다.
- CS1627: yield return 다음에는 식이 필요합니다.
- CS1629: 반복기에는 안전하지 않은 코드를 사용할 수 없습니다.
- CS1631: catch 절 본문에서는 값을 생성할 수 없습니다.
- CS1637: 반복기에 안전하지 않은 매개 변수 또는 yield 형식을 사용할 수 없습니다.
- CS4013: 형식의 인스턴스는 중첩된 함수, 쿼리 식, 반복기 블록 또는 비동기 메서드 내에서 사용할 수 없습니다.
- CS8154: 본문은 참조로 반환되므로 반복기 블록이 될 수 없습니다.
- CS8176: 반복기에 by-reference 로컬을 사용할 수 없습니다.
- CS9238: 'unsafe' 블록에서 'yield return'을 사용할 수 없습니다.
-
CS9239:
&연산자는 반복기 메서드의 매개 변수 또는 지역 변수에 사용할 수 없습니다.
반복기 메서드의 구조
반복기 메서드는 C#의 여러 규칙을 준수해야 합니다. 컴파일러는 반복기 메서드가 이러한 규칙 중 하나 이상을 위반할 때 다음과 같은 오류를 표시합니다.
- CS1622: 반복기에서 값을 반환할 수 없습니다. yield return 문을 사용하여 값을 반환하거나 yield break 문을 사용하여 반복을 끝내세요.
- CS1624: 'type'이 반복기 인터페이스 형식이 아니므로 'accessor'의 본문은 반복기 블록이 될 수 없습니다.
- CS1627: yield return 다음에는 식이 필요합니다.
- CS1637: 반복기에 안전하지 않은 매개 변수 또는 yield 형식을 사용할 수 없습니다.
- CS8154: 본문은 참조로 반환되므로 반복기 블록이 될 수 없습니다.
반복기 메서드는 다음 규칙을 따라야 합니다.
- 반복기 메서드(
yield return및 선택적으로yield break사용)는return문을 사용하여 시퀀스를 반환할 수도 없습니다. - 반복기 메서드는 반복기 인터페이스 형식을 반환 형식으로 선언해야 합니다. 반복기 인터페이스 형식은 다음과 같습니다. IEnumerable, IEnumerable<T>, IEnumerator, IEnumerator<T>
-
yield return문은 시퀀스의 일부로 반환하는 식을 포함해야 합니다.yield return;가 잘못되었습니다. - 반복기 메서드는 안전하지 않은 형식을 포인터와 같은 매개 변수로 사용할 수 없습니다.
- 반복기 메서드는 포인터와 같은
yield return안전하지 않은 형식을 사용할 수 없습니다. - 반복기 메서드는
yield return로ref를 수행할 수 없습니다. 값으로 반환해야 합니다.
반복기 메서드에 대한 제한 사항
반복기 메서드의 본문은 yield return 문 및 해당 컨텍스트에 대한 제한 사항을 준수해야 합니다. 컴파일러는 반복기가 이러한 제한 사항 중 하나를 위반할 때 다음과 같은 오류를 표시합니다.
- CS1625: finally 절의 본문에서는 yield를 사용할 수 없습니다.
- CS1626: catch 절이 포함된 try 블록의 본문에서는 값을 생성할 수 없습니다.
- CS1631: catch 절 본문에서는 값을 생성할 수 없습니다.
- CS1629: 반복기에는 안전하지 않은 코드를 사용할 수 없습니다.
- CS9238: 'unsafe' 블록에서 'yield return'을 사용할 수 없습니다.
-
CS9239:
&연산자는 반복기 메서드의 매개 변수 또는 지역 변수에 사용할 수 없습니다.
이러한 오류는 반복기가 요소를 반환하고 다음 요소를 생성하기 위해 다시 시작되므로 코드가 안전 규칙을 위반했음을 나타냅니다.
-
yield return또는catch절에서finally을 수행할 수 없습니다. - catch 절이 있는
yield return블록에서try을 수행할 수 없습니다. -
yield return블록에서unsafe을 수행할 수 없습니다. 반복기의 컨텍스트는 바깥쪽safe블록 내에 중첩된unsafe블록을 만듭니다. -
&연산자를 사용하여 반복기 메서드에서 변수의 주소를 사용할 수 없습니다.
C# 13 이전에는 반복기에 unsafe 코드를 포함할 수 없습니다(CS1629). C# 13부터 이 제한이 완화됩니다. 모든 yield return 문은 안전한 컨텍스트에 있어야 하지만 반복기 메서드는 unsafe 코드를 포함할 수 있습니다.
반복기 메서드의 참조 안전성
반복기 메서드에는 특수한 참조 안전 제한이 있습니다. 이러한 규칙은 C# 13에서 완화됩니다.
- CS4013: 형식의 인스턴스는 중첩된 함수, 쿼리 식, 반복기 블록 또는 비동기 메서드 내에서 사용할 수 없습니다.
- CS8176: 반복기에 by-reference 로컬을 사용할 수 없습니다.
C# 13 이전에는 반복기가 ref 지역 변수를 선언할 수 없었습니다.
ref struct 형식의 변수를 선언할 수 없습니다.
C# 13부터 ref struct 문을 통해 액세스되지 않는 경우 yield return 형식을 반복기 메서드에서 사용할 수 있습니다. C# 13부터 반복기 메서드는 ref 지역 변수를 선언할 수 있습니다.
.NET