overload herencia español c# constructor

español - herencia c# constructor base



¿Está formalmente definido el "orden textual" en las clases parciales? (2)

Aquí hay otro fragmento de la especificación de C # que, tomada con su fragmento, parece resolver que este es un comportamiento indefinido:

10.2.6 Miembros

[...] El orden de los miembros dentro de un tipo rara vez es significativo para el código C #, pero puede ser significativo al interactuar con otros lenguajes y entornos. En estos casos, el orden de los miembros dentro de un tipo declarado en varias partes no está definido.

Para ser justo, dice que rara vez es significativo, no es insignificante :).

Específicamente, en relación con los inicializadores de campo (en este caso, estático) - §17.11 en ECMA 334:

Si una clase contiene campos estáticos con inicializadores, esos inicializadores se ejecutan en orden textual inmediatamente antes de ejecutar el constructor estático.

Ahora, si tenemos múltiples clases partial en archivos separados, ¿ese orden se determina en cualquier lugar? Mi instinto dice "no definido formalmente, pero probablemente se relaciona con el orden incluido en el csproj, o el orden señalado a csc". ¿Es esto correcto?

(y sí, me doy cuenta de que sería mejor evitar la ambigüedad por completo, probablemente moviendo toda la inicialización a un constructor estático).

Por ejemplo, si tengo a.cs :

using System; partial class Program { private static int Foo = Write("Foo"); static int Write(string name) { Console.WriteLine(name); return 0; } static void Main() { Console.WriteLine("[press any key]"); Console.ReadLine(); } }

y b.cs :

partial class Program { private static int Bar = Write("Bar"); }

y:

<Compile Include="a.cs" /> <Compile Include="b.cs" />

entonces esto es Foo luego Bar ; si, sin embargo, esto es:

<Compile Include="b.cs" /> <Compile Include="a.cs" />

entonces es Bar luego Foo . Esto respalda la observación, pero no la expresa enérgicamente. §8.7.13 (Declaraciones de tipo parciales) no hace ningún comentario sobre el orden cuando se combinan clases partial . Asi que; ¿Hay algo más fuerte que podamos decir aquí, ya sea de la especificación del lenguaje C # o de la documentación de herramientas?

Además, se comporta de manera similar con csc a.cs b.cs vs csc b.cs a.cs


Sé que esta pregunta es muy antigua, pero esta es la parte correcta de la especificación:

ECMA-334 (Especificación del lenguaje C #), inicializadores de variables , sección 17.4.5:

Cuando hay declaraciones de campo en declaraciones de tipos parciales múltiples para el mismo tipo, el orden de las partes no se especifica. Sin embargo, dentro de cada parte, los inicializadores de campo se ejecutan en orden.

Entonces, el "orden textual" en tipos parciales no está indefinido, sino que está parcialmente definido. ;-)