vs2010 beta 2下的CS0120错误 - 需要对象引用

时间:2009-10-21 10:36:59

标签: c# visual-studio-2010

以下代码用于在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 个答案:

答案 0 :(得分:18)

更新

  

§7.5.7此访问权限

     

this-access 由保留字this组成。

     

此访问:

this
     

只允许在实例构造函数,实例方法或实例访问器的中使用 this-access

这些都不是。 4.0编译器看起来是正确的。据推测,它并不高兴,因为本质上提供了在未初始化类型时访问this的权限。也许; -p

请注意,我认为导致此问题的this.someField并非真正 - 更多的是使用字段导致this捕获< / em>,意思是它想要将this实例提升到编译器生成的类中 - 就像你写的那样:

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

C#3.0编译器发现上述滥用this


再现。调查。它似乎是解决构造函数链中隐式this的问题。

最可能的解决方法是使用virtual方法而不是委托,并在派生类中简单地覆盖它。

一种解决方法是将实例作为参数传递,因此委托变为“obj =&gt; 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编译器可能是正确的。

答案 1 :(得分:-3)

添加:  静态对象previousValue;