C# Error CS8176 – Iterators cannot have by-reference locals

C# Error

CS8176 – Iterators cannot have by-reference locals

Reason for the Error & Solution

Iterators cannot have by-reference locals

Iterator blocks use deferred execution, where the evaluation of an expression is delayed until its realized value is actually required. To manage that deferred execution state, iterator blocks use a state machine, capturing variable state in closures implemented in compiler-generated classes and properties. A local variable reference (on the stack) cannot be captured within the instance of a class in the heap, so the compiler issues an error.

Example

The following sample generates CS8176:

// CS8176.cs (7,26)

using System.Collections.Generic;
class C
{
    IEnumerable<int> M()
    {
        ref readonly int x = ref (new int[1])[0];
        int i = x;
        yield return i;
    }
}

To correct this error

Removing use of by-reference corrects this error:

class C
{
    IEnumerable<int> M()
    {
        int x = (new int[1])[0];
        int i = x;
        yield return i;
    }
}