2010-11-26 19 views
6

C# CS0236 no permite un campo inicializador ejemplo hacer referencia a otro campo. Por ejemplo, este código no es válido:razón conceptual de la 'A inicializador de campo no puede hacer referencia al campo no estático, método o propiedad' Error

class A 
{ 
string s1 = ""; 
string s2 = s1; 
} 

porque "s1" referencias "S2".

¿Pero por qué esto no está permitido?

Mi primer pensamiento fue que los C# especificaciones no garantizan ninguna orden de inicialización, pero de acuerdo con las especificaciones de la orden es el orden de declaración:

Los inicializadores de variables se ejecutan en el orden textual en que aparecen en la declaración de clase.

Entonces, si el orden es determinista, ¿cuáles podrían ser los peligros de este tipo de código?

Gracias de antemano por su ayuda.

EDIT:

De acuerdo con las respuestas de Hps, 0xA3 y Peter:

  • orden de inicialización en el escenario de la herencia puede ser muy confuso,

  • implementando tal característica requiere algunos recursos del equipo de desarrollo del compilador para poco beneficio,

  • que no es posible utilizar métodos o propiedades por razones lógicas (gracias Peter), por lo que para mantener la coherencia del mismo es cierto para los campos.

+0

Vale la pena señalar que vb.net ejecuta iniciadores de campo después de la construcción del objeto base, y les permite hacer referencia al objeto que se está construyendo. Considero que esto es algo bueno, especialmente en los casos en que existe una relación invariante entre los campos. Sería incluso mejor si exponer los parámetros del constructor a los inicializadores de campo fuera menos torpe. – supercat

Respuesta

4

Este artículo puede responder su pregunta.

Execution Order

+1

Por lo tanto, básicamente, el orden de ejecución entre inicializadores de campo de instancia en línea derivados y derivados no es definitivo. – Hps

+0

No puedo enviar un voto a favor porque mi límite diario se ha alcanzado, pero seguramente lo haré al día siguiente. Gracias por el buen enlace – TalentTuner

+0

Gracias por este enlace, es sin duda una parte de la respuesta. – Pragmateek

2

El compilador probablemente podría comprobar el orden de los campos y luego permitir la inicialización si el otro campo se ha declarado previamente.

Además de la trampa que el reordenamiento o la reestructuración rompe su código, ¿por qué el compilador debe ser innecesariamente complejo? Los recursos son limitados, y el equipo compilador probablemente prefiera trabajar en funciones con mayor prioridad.

+0

Gracias por esta observación. Debe tener razón, el equipo del compilador a menudo justifica la falta de características por la falta de recursos. Lástima que no tengan más recursos para hacer que C# sea mejor de lo que es. – Pragmateek

5

No estoy seguro acerca de un campo, pero parece racional negar el acceso de los inicializadores de campo a las propiedades o métodos. Por ejemplo:

class A 
{ 
    string s1 = GetString(); 
    string s2 = this.MyString; 
    string s3 = "test"; 

    public string GetString() 
    { 
     // this method could use resources that haven't been initialized yet 
    } 

    public string MyString 
    { 
     get { return s3; } 
     // this field hasn't been initialized yet 
     // (okay, strings have a default value, but you get the picture) 
    } 
} 
+0

Haces un muy buen punto aquí, gracias. – Pragmateek

Cuestiones relacionadas