Específicamente, en relación con inicializadores de campo (en este caso, estática) - §17.11 en ECMA 334:¿Está formalmente definido el "orden textual" en las clases parciales?
Si una clase contiene todos los campos estáticos con inicializadores, esos inicializadores se ejecutan en orden textual inmediatamente antes de ejecutar el constructor estático
Ahora, si tenemos varias clases partial
en archivos separados, ¿ese orden se determina en algún 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 este es Foo
entonces Bar
; Si, sin embargo, esto es:
<Compile Include="b.cs" />
<Compile Include="a.cs" />
entonces es Bar
continuación Foo
. Este admite la observación, pero no lo dice con fuerza. §8.7.13 (Declaraciones de tipo parciales) no hace ningún comentario sobre el orden al combinar las 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
.
muy buena pregunta –