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