С# - Почему я не могу передать класс, объявленный в операторе using в качестве ссылочного типа? - программирование
Подтвердить что ты не робот

С# - Почему я не могу передать класс, объявленный в операторе using в качестве ссылочного типа?

Предположим, у меня есть следующий одноразовый класс и пример кода для его запуска:

public class DisposableInt : IDisposable
{
    private int? _Value;

    public int? MyInt
    {
        get { return _Value; }
        set { _Value = value; }
    }

    public DisposableInt(int InitialValue)
    {
        _Value = InitialValue;
    }

    public void Dispose()
    {
        _Value = null;
    }
}

public class TestAnInt
{
    private void AddOne(ref DisposableInt IntVal)
    {
        IntVal.MyInt++;
    }

    public void TestIt()
    {
        DisposableInt TheInt;
        using (TheInt = new DisposableInt(1))
        {
            Console.WriteLine(String.Format("Int Value: {0}", TheInt.MyInt));
            AddOne(ref TheInt);
            Console.WriteLine(String.Format("Int Value + 1: {0}", TheInt.MyInt));
        }
    }
}

Вызов new TestAnInt().TestIt() выполняется просто отлично. Однако, если я изменяю TestIt() так, чтобы DisposableInt объявлялся внутри оператора using следующим образом:

    public void TestIt()
    {
        // DisposableInt TheInt;
        using (DisposableInt TheInt = new DisposableInt(1))
        {
            Console.WriteLine(String.Format("Int Value: {0}", TheInt.MyInt));
            AddOne(ref TheInt);
            Console.WriteLine(String.Format("Int Value + 1: {0}", TheInt.MyInt));
        }
    }

Я получаю следующую ошибку компилятора:

Cannot pass 'TheInt' as a ref or out argument because it is a 'using variable'

Почему это? Чем отличается, кроме класса, выходит из области видимости и сборщика мусора после завершения инструкции using?

(и да, я знаю, что мой пример одноразового класса довольно глупый, я просто стараюсь держать дело простым)

4b9b3361

Ответ 1

Почему это?

Переменные, объявленные в операторах using, доступны только для чтения; out и ref нет. Итак, вы можете сделать это:

DisposableInt theInt = new DisposableInt(1);
using (theInt)
{
    AddOne(ref theInt);
}

... но в принципе вы не используете тот факт, что параметр a ref в любом случае...

Возможно, вы неправильно поняли, что означает ref. Было бы неплохо прочитать статью о передаче параметров, чтобы убедиться, что вы действительно понимаете.