Поделиться через


Ошибка компилятора CS1657

Обновлен: Ноябрь 2007

Сообщение об ошибке

Невозможно передать "параметр" в качестве аргумента ref или out, поскольку "причина"
Cannot pass 'parameter' as a ref or out argument because 'reason''

Эта ошибка происходит при передаче аргумента ref или out в контексте, когда переменная доступна только для чтения. В контекстах только для чтения содержатся переменные итерации foreach, переменные using и переменные fixed. Чтобы разрешить эту ошибку, не вызывайте функции, принимающие переменную foreach, using или fixed в качестве параметра ref или out в блоках using, операторах foreach и fixed.

Пример

Следующий пример приводит к возникновению ошибки 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
        }
    }
}

Следующий код иллюстрирует ту же проблему в операторе 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
    }
}