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.