Подтвердить что ты не робот

Формально ли определяется "текстовый порядок" по частичным классам?

В частности, относительно инициализаторов полей (в данном случае статических) - §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. Так; есть ли что-нибудь более сильное, что мы можем здесь сказать, либо из спецификации языка С#, либо из документации по инструментарию?

Кроме того, он ведет себя аналогично csc a.cs b.cs vs csc b.cs a.cs.

4b9b3361

Ответ 1

Здесь другой фрагмент из спецификации С#, который, взятый с вашим фрагментом, похоже, определяет, что это поведение undefined:

10.2.6 Участники

[...] Порядок членов в пределах типа редко бывает значительным для С#, но может быть значительным при взаимодействии с другими языками и среды. В этих случаях порядок членов в пределах тип, объявленный в нескольких частях, undefined.

Если быть справедливым, то он говорит редко значимые, а не незначительные:).

Ответ 2

Я знаю, что этот вопрос очень старый, но вот правильная часть спецификации:

ECMA-334 (спецификация языка С#), Переменные инициализаторы, раздел 17.4.5:

Когда есть объявления полей в нескольких частичных типах объявления одного и того же типа, порядок деталей не определен. Однако в каждой части инициализаторы полей выполняются в порядок.

Таким образом, "текстовый порядок" в частичных типах не undefined, а частично определенный.; -)