En C#, un constructor se ejecuta la secuencia:
Perform all field initializers
Chain to base class constructor
Execute user-supplied code for constructor
En vb.net, la secuencia es:
Chain to base class constructor
Perform all field initializers
Execute user-supplied code for constructor
No hay Framework-bas Por eso C# hace las cosas en el orden en que lo hace, como lo demuestra el hecho de que vb.net puede y lo hace en una secuencia diferente. La justificación del diseño para el enfoque de C# es que no debería haber posibilidad de que un objeto se exponga al mundo exterior antes de que se hayan ejecutado todos los inicializadores de campo (tanto para los campos derivados como para los de clase base); dado que un constructor de clase base podría exponer un objeto al mundo exterior, hacer cumplir ese requisito significa que los inicializadores de campo deben ejecutarse antes que el constructor de la clase base.
Personalmente, no encuentro esta justificación particularmente convincente. Hay muchos escenarios en los que no será posible establecer campos en valores útiles sin tener información que no estará disponible antes de que se ejecute el constructor base. Cualquier código cuyo constructor base pueda exponer instancias parcialmente construidas necesita estar preparado para esa posibilidad. Si bien hay ocasiones en las que sería útil especificar que un inicializador de campo debería ejecutarse "temprano", creo que hay muchas más situaciones en las que es útil que puedan acceder al objeto de aprendizaje (en cierta medida porque creo que los campos de clase cuyos valores deben considerarse como invariantes durante el tiempo de vida de una instancia de clase deben, cuando sea práctico, establecerse declarativamente a través de inicializadores en lugar de imperativamente dentro de un constructor).
Incidentalmente, una característica que me gustaría ver tanto en vb.net como en C# sería un medio de declarar campos inicializados por parámetros y pseudo-campos. Si una clase tiene un campo inicializado por parámetro de un cierto nombre y tipo, cada constructor para esa clase que no encadena a otro de la misma clase debe contener parámetros con los nombres y tipos apropiados. Los valores de esos campos se establecerían en el constructor antes de que se haga cualquier otra cosa, y serían accesibles a otros inicializadores de campo. Los pseudo-campos se comportarían sintácticamente como campos, excepto que se usarían solo dentro de los inicializadores de campo, y se implementarían como variables locales dentro de los constructores. Tal característica haría que muchos tipos de estructuras fueran más convenientes. Por ejemplo, si se supone que un tipo para mantener una instancia de matriz particular, durante su vida útil, ser capaz de decir:
readonly param int Length;
readonly ThingType[] myArray = new ThingType[Length];
parecería más agradable que tener que o bien la construcción de la matriz en el constructor de la clase (que no podría suceder hasta después de que se haya ejecutado el constructor base) o (para vb.net) tener que pasar la longitud a un constructor de clase base que podría usarlo para establecer un campo (que luego ocuparía espacio en la clase, incluso si su valor-- como Length
arriba - puede ser redundante).
No, la razón por la que no compila no es para nada que 'Identity' está en la clase base, es simplemente porque es un miembro de instancia. Entonces, la pregunta en el título no es relevante para lo que estás tratando de hacer ... – Guffa