與
與 陳述式和迭代器方法相關的yield return有很多:
- CS1622:無法從迭代器中傳回值。請使用 'yield return' 陳述式傳回值,或使用 'yield break' 結束迭代。
- CS1624:'accessor' 的主體不可是迭代區塊,因為 'type' 不是迭代器介面類型
- CS1625:finally 子句的主體中不可使用 yield
- CS1626:在具有 catch 子句的 try 區塊主體中不可使用 yield 產生值
- CS1627:yield 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' 不是迭代器介面類型
- CS1627:yield return 之後應接著運算式
- CS1637:迭代器不能有 Unsafe 參數或 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 區塊主體中不可使用 yield 產生值
- CS1631:無法在 catch 子句主體中使用 yield 產生值
- 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 程式碼。
迭代器方法中的 'ref' 安全性
迭代器方法具有特殊的 ref 安全性限制。 在 C# 13 中,這些規則已放寬:
- CS4013:類型的執行個體不能在巢狀函式、查詢運算式、迭代區塊或非同步方法中使用
- CS8176:迭代器不能有參考型局部變數
在 C# 13 之前,迭代器不能宣告 ref 局部變數。 它們不能宣告任何 ref struct 類型的變數。
從 C# 13 開始,您可以在迭代器方法中使用 ref struct 類型 (如果無法跨 yield return 陳述式存取類型)。 從 C# 13 開始,迭代器方法可以宣告 ref 局部變數。