una requiere referencia puede propiedad para objeto necesita método metodo llamar inicializador hacer estáticos estático estatico destino campo c# visual-studio-2010

c# - puede - Error de CS0120 en vs2010 beta 2: se requiere referencia al objeto



se requiere una referencia de objeto para el campo método o propiedad no estáticos c# (2)

Añadir: objeto estático previousValue;

el siguiente código solía funcionar bien en 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; }) { } } }

pero ahora informa. Se requiere una referencia de objeto para el campo, método o propiedad no estática ''N2.Engine.Globalization.DictionaryScope.previousValue''

¿Parece algo cambiado en el compilador? ¿Alguna solución?

actualizar:

Respecto a la sugerencia de utilizar un método virtual. Esto probablemente tampoco funcionaría, ya que el método virtual se llamaría desde el constructor base, lo que creo que tampoco es posible.

Aquí está la implementación del Ámbito (clase base):

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


Actualizar:

§ 7.5.7 Este acceso

Un acceso de este consiste en la palabra reservada this .

este acceso:

this

Un acceso de este solo se permite en el bloque de un constructor de instancia, un método de instancia o un descriptor de acceso de instancia.

Esto no es nada de esto. El compilador 4.0 parece correcto. Es de suponer que no está contento porque esto, en esencia, proporciona acceso a this en un momento en que el tipo no está inicializado. Tal vez ;-p

Tenga en cuenta que espero que no sea realmente el this.someField que causa esto, más que el uso de un campo hace que se this.someField esto, lo que significa que quiere cargar this instancia en una clase generada por el compilador, como si hubiera escrito:

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

El compilador C # 3.0 detecta el abuso anterior de this .

Reproducido Investigando Parece un problema resolviendo this implícito en el encadenamiento de constructores.

La solución más probable sería utilizar un método virtual lugar de un delegado, y simplemente anularlo en la clase derivada.

Una solución alternativa sería pasar la instancia como un argumento, de modo que el delegado se convierta en "obj => obj.whatever ...", y use theDelegate(this); .

Repro más simple:

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"; }) { } }

Necesitaría verificar la especificación, pero no estoy seguro de si this es válido en este contexto ... por lo que el compilador 4.0 podría ser correcto.