Error del compilador CS1657

Actualización: noviembre 2007

Mensaje de error

No se puede pasar 'parámetro' como argumento ref o out porque 'motivo'
Cannot pass 'parameter' as a ref or out argument because 'reason''

Este error se produce cuando se pasa una variable como argumento ref o out en un contexto en el que esa variable es de sólo lectura. Los contextos de sólo lectura incluyen las variables de iteración foreach, las variables using y las variables fixed. Para resolver este error, no llame a funciones que utilicen la variable foreach, using o fixed como un parámetro ref o out en bloques using, instrucciones foreach e instrucciones fixed.

Ejemplo

El código siguiente genera el error CS1657:

// CS1657.cs
using System;
class C : IDisposable
{
    public int i;
    public void Dispose() {}
}

class CMain
{
    static void f(ref C c)
    {
    }
    static void Main()
    {
        using (C c = new C())
        {
            f(ref c);  // CS1657
        }
    }
}

El código siguiente ilustra el mismo problema en una instrucción fixed:

// CS1657b.cs
// compile with: /unsafe
unsafe class C
{
    static void F(ref int* p)
    {
    }

    static void Main()
    {
        int[] a = new int[5];
        fixed(int* p = a) F(ref p); // CS1657
    }
}