yield return
ステートメントおよび iterator メソッドに関連するエラーと警告
ステートメントと iterator メソッドに関連するyield return
は多数あります。
- CS1622: 反復子から値を返すことはできません。yield return ステートメントを使用して値を返すか、yield break を使用して反復処理を終了します。
- CS1624: 「type」が反復子インターフェイス型ではないため、「accessor」の本文は、反復子ブロックにはできません。
- CS1625: finally 句のの本文で一時停止できません
- CS1626: catch 句がある try block の本文で値を一時停止できません
- CS1627: yield return 後に式が必要です
- CS1629: unsafe コードは、反復子で表示されません
- CS1631: catch 句の本文で値を一時停止できません
- CS1637: 反復子に unsafe パラメータまたは yield 型を指定できません
- CS4013: 型のインスタンスは、ネストされた関数、クエリ式、反復子ブロック、または非同期メソッドでは使用できません
- CS8154: 参照渡しで返すため、本文を反復子ブロックにすることはできません
- CS8176: 反復子は参照渡しのローカル変数を持つことができません
- CS9238: 「yield return」を「unsafe」ブロックで使用できません
- CS9239:
&
演算子は、iterator メソッドのパラメータまたはローカル変数で使用できません
iterator メソッドの構造
iterator メソッドは、C# の一部の規則に準拠している必要があります。 iterator メソッドがこれらの規則の 1 つ以上に違反すると、コンパイラは次のエラーを発行します。
- CS1622: 反復子から値を返すことはできません。yield return ステートメントを使用して値を返すか、yield break を使用して反復処理を終了します。
- CS1624: 「type」が反復子インターフェイス型ではないため、「accessor」の本文を反復子ブロックにできません
- CS1627: yield return 後に式が必要です
- CS1637: 反復子は、unsafe パラメータまたは yield 型を指定できません
- CS8154: 参照渡しで返すため、本文を反復子ブロックにすることはできません
iterator メソッドは、次の規則に従う必要があります。
- iterator メソッド (
yield return
を使用。必要に応じて、yield break
も使用) は、return
ステートメントを使用してシーケンスを返すことはできません。 - iterator メソッドは、return 型として、反復子インターフェイス型を宣言する必要があります。 反復子インターフェイス型は、IEnumerable、IEnumerable<T>、IEnumerator、IEnumerator<T> です。
yield return
ステートメントには、シーケンスの一部として返す式を含める必要があります。yield return;
は無効です。- iterator メソッドは、ポインターなどのパラメータとして unsafe 型を使用できません。
- iterator メソッドは、ポインターなどの
yield return
unsafe 型にはできません。 - iterator メソッドは、
yield return
ではref
できません。 値で返す必要があります。
iterator メソッドに関する制限事項
iterator メソッドの本文は、yield return
ステートメントとそのコンテキストの制限に準拠している必要があります。 反復子がこれらの制限のいずれかに違反すると、コンパイラは次のエラーを発行します。
- CS1625: finally 句の本文で一時停止できません
- CS1626: catch 句がある try block の本文で値を一時停止できません
- CS1631: catch 句の本文で値を一時停止できません
- CS1629: Unsafe コードが反復子に表示されない場合があります
- CS9238: 「yield return」を「unsafe」ブロックで使用できません
- CS9239:
&
演算子は、iterator メソッドのパラメータまたはローカル変数で使用できません
これらのエラーは、反復子が要素を返し、再開して次の要素を生成するため、コードが安全規則に違反していることを示しています。
yield return
句またはcatch
句からfinally
することはできません。- catch 句を使用して
yield return
ブロックからtry
することはできません。 yield return
ブロックからunsafe
することはできません。 反復子のコンテキストは、外側のsafe
ブロック内でネストされているunsafe
ブロックを作成します。&
演算子を使用して、iterator メソッド内の変数のアドレスを取得することはできません。
C# 13 より前では、反復子に unsafe
コード (CS1629) を含めることはできません。 C# 13以降では、この制限が緩和されています。 すべての yield return
ステートメントは安全なコンテキスト内にある必要がありますが、iterator メソッドには unsafe
コードを含めることができます。
iterator メソッドの ref safety
iterator メソッドには、特別な ref safety 制限があります。 C# 13 では、これらの規則は緩和されています。
- CS4013: インスタンスの型は、ネストされた関数、クエリ式、反復子ブロック、非同期メソッドでは使用できません
- CS8176: 反復子は by-reference local を持つことができません
C# 13 より前では、反復子は ref
ローカル変数を宣言できませんでした。 ref struct
型の変数を宣言できませんでした。
C# 13 以降では、反復子メソッド内で ref struct
型を使用できます (yield return
ステートメント間でアクセスしない限り)。 C# 13 以降では、iterator メソッドは、ref
ローカル変数を宣言できます。
.NET