Ошибка CS0120 при vs2010 beta 2 - требуется ссылка на объект

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

namespace N2.Engine.Globalization
{
    public class DictionaryScope : Scope
    {
                object previousValue;
        public DictionaryScope(IDictionary dictionary, object key, object value)
            : base(delegate
            {

                if (dictionary.Contains(key))
                    previousValue = dictionary[key];
                dictionary[key] = value;
            }, delegate
            {
                if (previousValue == null)
                    dictionary.Remove(key);
                else
                    dictionary[key] = previousValue;
            })
        {

        }
    }
}

но теперь он сообщает, что для нестатического поля, метода или свойства требуется ссылка объекта. 'N2.Engine.Globalization.DictionaryScope.previousValue'

Кажется, что что-то изменилось в компиляторе? Любые обходные пути?

обновление:

относительно предложения использовать виртуальный метод. Возможно, это тоже не сработает, поскольку виртуальный метод будет вызван из базового конструктора, который, как мне кажется, также невозможен?

Вот реализация области действия (базовый класс):

public class Scope: IDisposable
    {
        Action end;

        public Scope(Action begin, Action end)
        {
            begin();
            this.end = end;
        }

        public void End()
        {
            end();
        }

        #region IDisposable Members

        void IDisposable.Dispose()
        {
            End();
        }

        #endregion

Ответ 1

Update:

§ 7.5.7 Этот доступ

Этот доступ состоит из зарезервированного слова this.

доступа:

this

Этот доступ разрешен только в блоке конструктора экземпляра, метода экземпляра или экземпляра экземпляра.

Это ничто из этого. Компилятор 4.0 выглядит правильно. Предположительно это недовольство, потому что это по существу обеспечивает доступ к this в момент, когда тип не инициализируется. Может быть; -p

Обратите внимание, что я ожидаю, что это не так, как это делает this.someField - больше того, что использование поля вызывает this, что означает, что он хочет поднять экземпляр this на компилятор - сгенерированный класс - как будто вы написали:

public MyCtor() : base( new SomeType(this).SomeMethod ) {...}

Компилятор С# 3.0 указывает на злоупотребление выше this.


Воспроизводится. Исследуя. Это выглядит как проблема, разрешающая неявный this в цепочке конструктора.

Наиболее вероятным решением было бы использовать метод virtual вместо делегата и просто переопределить его в производном классе.

Одним из способов решения проблемы было бы преобразовать экземпляр в качестве аргумента, поэтому делегат станет "obj = > obj.whatever..." и используйте theDelegate(this);.

Упрощенное воспроизведение:

public class MyBase {
    public MyBase(Action a) { }
}
public class MySub : MyBase {
    private string foo;
    // with "this.", says invalid use of "this"
    // without "this.", says instance required
    public MySub() : base(delegate { this.foo = "abc"; }) { }
}

Мне нужно будет проверить спецификацию, но я не уверен, что this действителен в этом контексте... так что компилятор 4.0 может быть правильным.

Ответ 2

Добавить:   статический объект previousValue;