una requiere referencia que puede propiedad para objeto método inicializador hacer estáticos campo c# language-design

requiere - ¿Por qué C#no permite el inicializador de campo con campos no estáticos?



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

Estoy más interesado en la razón / lógica por la cual fue restringido. sólo por curiosidad.

Si lees la especificación de lenguaje C #, 10.11.3, esto alude al razonamiento aquí. En la discusión de inicializadores de variables :

Es útil pensar en los inicializadores de variable de instancia y los inicializadores de constructor como declaraciones que se insertan automáticamente antes del cuerpo-constructor.

Dado que estos están "insertados antes que el constructor", se están ejecutando antes de que this sea ​​válido, por lo que permitirle consultar a otros miembros (de hecho this ) sería problemático.

Tenga en cuenta que esto también es consistente con cómo funcionan static campos static . En ambos casos, se le permite acceder a datos estáticos, pero no a datos de instancia. El mensaje de error que recibe ("Un inicializador de campo no puede hacer referencia al campo, método o propiedad no estática") señala esto directamente.

Por qué C # permitirá esto:

public class MyClass { static int A=1; static int B=A+1; }

Pero no permitirá ( "Un inicializador de campo no puede hacer referencia al campo, método o propiedad no estática" )

public class MyClass { int A=1; int B=A+1; }

Pensé que es el orden que se garantiza (con campos estáticos) inicializarse secuencialmente como aparece, pero también se aplica aquí como se puede ver:

public class MyClass { int A=((Func<int>)(delegate(){ Console.WriteLine ("A"); return 1;}))(); int B=((Func<int>)(delegate(){ Console.WriteLine ("B"); return 2;}))(); int C=((Func<int>)(delegate(){ Console.WriteLine ("C"); return 3;}))(); } void Main() { var a = new MyClass(); }

Resultado:

A B C

Pregunta

Estoy más interesado en la razón / lógica por la cual fue restringido. sólo por curiosidad.

NB no encontró ningún duplicado.


"Use el modificador estático para declarar un miembro estático, que pertenece al tipo mismo en lugar de a un objeto específico". - MSDN estático

Cuando A y B se declaran estáticos, pertenecen al tipo MyClass y todas las instancias de MyClass tendrán el mismo valor para A y B El constructor estático se ejecutará antes de que la clase sea instanciada pero después de que el programa haya comenzado. En ese punto, A ya está definido y, por lo tanto, B puede hacer referencia a él.

Por otro lado, cuando A y B no son estáticos, solo pertenecen a la instancia de MyClass . Mientras compila, el campo B intentará inicializarse basándose en un valor de A que aún no se ha inicializado. No hay ninguna instancia de MyClass mientras el compilador se está ejecutando y, por lo tanto, no hay un valor de A para referencia.