與 yield return
陳述式和迭代器方法相關的錯誤和警告
與 陳述式和迭代器方法相關的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
局部變數。