部分class级的“文本秩序”是否正式定义?

具体来说,关于字段初始值设定项(在这种情况下,是静态的) – ECMA 334中的§17.11:

如果一个类包含任何具有初始值设定项的静态字段,那么在执行静态构造函数之前,这些初始值设定项将按照文本顺序执行。

现在,如果我们在单独的文件中有多个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(部分types声明)在组合partial类时不会评论顺序。 所以; 有什么更强大的,我们可以在这里说,从C#语言规范或从工具文档?

此外,它的行为与csc a.cs b.cscsc b.cs a.cs相似。

下面是C#规范中的另一个代码片段,与您的代码片段一起,似乎解决了这是未定义的行为:

10.2.6成员

[…]types内成员的sorting对C#代码来说很less有意义,但在与其他语言和环境进行交互时可能很重要。 在这些情况下, 在多个部分中声明的types中的成员的顺序是未定义的。

公平地说,它确实很less有意义,不是微不足道的:)。

我知道这个问题很老,但是这里是规范的正确部分:

ECMA-334 (C#语言规范), variables初始值设定项 ,第17.4.5节:

当在同一types的多个部分types声明中有字段声明时,部分的顺序是未指定的。 但是,在每个部分中,字段初始值设定项按顺序执行。

所以部分types的“文本顺序”不是不确定的,而是部分的 。 😉