共用方式為


yield return 陳述式和迭代器方法相關的錯誤和警告

陳述式和迭代器方法相關的yield return有很多:

  • CS1622無法從迭代器中傳回值。請使用 'yield return' 陳述式傳回值,或使用 'yield break' 結束迭代。
  • CS1624'accessor' 的主體不可是迭代區塊,因為 'type' 不是迭代器介面類型
  • CS1625finally 子句的主體中不可使用 yield
  • CS1626在具有 catch 子句的 try 區塊主體中不可使用 yield 產生值
  • CS1627yield return 之後應接著運算式
  • CS1629不安全的程式碼不能出現在迭代器中。
  • CS1631無法在 catch 子句主體中使用 yield 產生值
  • CS1637迭代器不能有 Unsafe 參數或 yield 類型
  • CS4013類型的執行個體不能在巢狀函式、查詢運算式、迭代區塊或非同步方法中使用
  • CS8154主體不能是迭代區塊,因為它是以參考傳回的
  • CS8176迭代器不能有參考型局部變數
  • CS9238無法在 'unsafe' 區塊中使用 'yield return'
  • CS9239迭代器方法中的參數或局部變數不能使用 & 運算子

迭代器方法的結構

迭代器方法必須遵循 C# 中的幾條規則。 當您的迭代器方法違反其中一條或多條規則時,編譯器會發出以下錯誤:

  • CS1622無法從迭代器中傳回值。請使用 'yield return' 陳述式傳回值,或使用 'yield break' 結束迭代。
  • CS1624'accessor' 的主體不可是迭代區塊,因為 'type' 不是迭代器介面類型
  • CS1627yield return 之後應接著運算式
  • CS1637迭代器不能有 Unsafe 參數或 yield 類型
  • CS8154主體不能是迭代區塊,因為它是以參考傳回的

您的迭代器方法必須遵循以下規則:

  • 迭代器方法 (使用 yield return 和選擇性 yield break) 不能同時使用 return 陳述式來傳回序列。
  • 迭代器方法必須將迭代器介面類型宣告為傳回類型。 迭代器介面類型有:IEnumerableIEnumerable<T>IEnumeratorIEnumerator<T>
  • yield return 陳述式必須包含一個運算式,以作為序列的一部分傳回。 yield return; 無效。
  • 迭代器方法不能使用不安全的類型作為參數,例如指標。
  • 迭代器方法不能 yield return 不安全類型,例如指標。
  • 迭代器方法不能以 yield return 使用 ref。 您必須以值傳回。

迭代器方法的限制

迭代器方法的主體必須遵守對 yield return 陳述式及其上下文的限制。 當您的迭代器違反其中一項限制時,編譯器會發出以下錯誤:

  • CS1625finally 子句的主體中不可使用 yield
  • CS1626在具有 catch 子句的 try 區塊主體中不可使用 yield 產生值
  • CS1631無法在 catch 子句主體中使用 yield 產生值
  • CS1629不安全的程式碼不能出現在迭代器中。
  • CS9238無法在 'unsafe' 區塊中使用 'yield return'
  • CS9239迭代器方法中的參數或局部變數不能使用 & 運算子

這些錯誤表示您的程式碼違反了安全規則,因為迭代器傳回一個元素後會恢復以生成下一個元素:

  • 您不能從 yield returncatch 區塊中 finally
  • 您不能從具有 catch 區塊的 yield return 區塊中進行 try
  • 您不能從 yield return 區塊中進行 unsafe。 迭代器的上下文會在封閉的 safe 區塊內建立一個巢狀的 unsafe 區塊。
  • 您不能在迭代器方法中使用 & 運算子來取得變數的位址。

在 C# 13 之前,迭代器不能包含unsafe的程式碼 (CS1629)。 從 C# 13 開始,這項限制已經放寬。 所有 yield return 陳述式必須在安全的上下文中,但迭代器方法可以包含 unsafe 程式碼。

迭代器方法中的 'ref' 安全性

迭代器方法具有特殊的 ref 安全性限制。 在 C# 13 中,這些規則已放寬:

  • CS4013類型的執行個體不能在巢狀函式、查詢運算式、迭代區塊或非同步方法中使用
  • CS8176迭代器不能有參考型局部變數

在 C# 13 之前,迭代器不能宣告 ref 局部變數。 它們不能宣告任何 ref struct 類型的變數。

從 C# 13 開始,您可以在迭代器方法中使用 ref struct 類型 (如果無法跨 yield return 陳述式存取類型)。 從 C# 13 開始,迭代器方法可以宣告 ref 局部變數。