2012-01-09 18 views
7
public T Prop = new Ctor(Method); 

private K Method(U controller, V request); 

me sale que no puede acceder Method aquí, porque Method se requiere para ser static. ¿Por qué es esto? Prop no es static.¿Por qué esto está en contexto estático?

Actualización: Aquí está la firma real:

public DataSource(Func<ControllerBase, AjaxDataTable.Request, Result> dataSelector) 

y es así como el método solía ser:

public AjaxDataTable<SourcesViewModel.Source.Channel>.DataSource AjaxData = 
    new AjaxDataTable<SourcesViewModel.Source.Channel>.DataSource(OnSelectData); 

Esto no fue un problema porque no tenía necesidad de referencia this, así que cuando agregué this y no compiló más, (el campo no era mío para empezar, alguien más lo había hecho así, así que no me odies por eso). He cambiado a lo siguiente:

private AjaxDataTable<SourcesViewModel.Source.Channel>.DataSource ajaxData; 
public AjaxDataTable<SourcesViewModel.Source.Channel>.DataSource AjaxData 
{ 
    get 
    { 
     if (ajaxData == null) 
     { 
      ajaxData = 
       new AjaxDataTable<SourcesViewModel.Source.Channel> 
        .DataSource(OnDataSelector); 
     } 
     return ajaxData; 
    } 
} 

Pero entonces el campo privado ajaxData siempre sería null, lo que hace que la tabla de datos se instanciado nuevo cada vez (esto se añade en un diccionario concurrente, lo que provoca un Exception en una llave duplicada). Quiero saber cómo funciona la asignación a un campo que no hace referencia a this. ¿Eso crea algo que se reutiliza en todas las instancias de un object?

+3

¿Por qué está pasando un método como parámetro? ¿Es eso realmente lo que intentas hacer? ¿O solo quieres mostrar que lo estás llamando y usar el resultado en el constructor? – Yuck

+0

Sí, es una expresión lambda. – bevacqua

+0

@abelenky ese es el punto. El compilador me dice que esto es ilegal porque se requiere que 'Method' sea' static'. – bevacqua

Respuesta

10

Esto es debido a la sección 10.5.5.2 de la C# 4 spec, que incluye:

A inicializador variable para un campo de instancia no se puede hacer referencia a la instancia está creando. Por lo tanto se trata de un error en tiempo de compilación para hacer referencia this en un inicializador de variable de [...]

Estás eficazmente referencia this, por ejemplo el código es equivalente a:

public T Prop = new Ctor(this.Method); 

Ahora Puedes argumentar que esta restricción es draconiana, pero esa es una discusión diferente. Tenga en cuenta que podría ponerlo en un cuerpo del constructor:

public T Prop; 

public Foo() 
{ 
    Prop = new Ctor(Method); 
} 

(estoy suponiendo que no hubiera realmente tener un campo público, y que tendría nombres sensibles, etc :)

+0

Jon, a veces da miedo ... +1 – Yuck

+1

@Yuck: Para ser justos, tuve que consultar las especificaciones. No lo sabía de memoria :) –

+0

He actualizado la pregunta – bevacqua

1

Como dice el compilador, "Un inicializador de campo no puede hacer referencia al campo, método o propiedad no estáticos", entonces; no puedes usar un inicializador de campo. Use un constructor en su lugar:

public T Prop; // public field? really? a property would be preferable most cases 
public YourType() { 
    Prop = new Ctor(Method); 
} 
+0

He actualizado la pregunta – bevacqua

Cuestiones relacionadas