次の方法で共有


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 型として、反復子インターフェイス型を宣言する必要があります。 反復子インターフェイス型は、IEnumerableIEnumerable<T>IEnumeratorIEnumerator<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 ローカル変数を宣言できます。