В частности, в отношении инициализаторов полей (в данном случае, статических) - §17.11 в ECMA 334:
Если класс содержит какие-либо статические поля с инициализаторами, эти инициализаторы выполняются в текстовом порядке непосредственно перед выполнением статического конструктора.
Теперь, если у нас есть несколько классов partial
в отдельных файлах, определяется ли этот порядок где-нибудь? Моя интуиция говорит: «Не определен формально, но, вероятно, относится к порядку, включенному в csproj, или к порядку, указанному для csc». Это правильно?
(и да, я понимаю, что было бы лучше полностью избежать неоднозначности - возможно, перенеся всю инициализацию в статический конструктор).
Например, если у меня есть 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();
}
}
и b.cs
:
partial class Program
{
private static int Bar = Write("Bar");
}
и
<Compile Include="a.cs" />
<Compile Include="b.cs" />
тогда это Foo
тогда Bar
; если, однако, это:
<Compile Include="b.cs" />
<Compile Include="a.cs" />
тогда это Bar
тогда Foo
. Это поддерживает наблюдение, но не утверждает это сильно. §8.7.13 (Частичные объявления типов) не комментирует порядок при объединении partial
классов. Так; Есть ли что-нибудь более сильное, что мы можем здесь сказать, из спецификации языка C # или из документации по инструменту?
Кроме того, он ведет себя аналогично с csc a.cs b.cs
против csc b.cs a.cs
.