Ошибка CS0120 в vs2010 beta 2 - требуется ссылка на объект - PullRequest
17 голосов
/ 21 октября 2009

следующий код, используемый для нормальной работы под 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'

В компиляторе что-то изменилось? Есть обходные пути?

Обновление:

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

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

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

Ответы [ 2 ]

18 голосов
/ 21 октября 2009

Обновление:

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

A this-access состоит из зарезервированного слова this.

это-доступ:

this

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

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

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

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

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


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

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

Один из обходных путей - вставить экземпляр в качестве аргумента, поэтому делегат становится "obj => obj.whwhat ..." и использует 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 может быть верным.

0 голосов
/ 25 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...