In particolare, in relazione alla inizializzatori campo (in questo caso, statico) - §17.11 in ECMA 334:L'"ordine testuale" tra classi parziali è definito in modo formale?
Se una classe contiene i campi statici con initializers, tali initializers vengono eseguiti in ordine testuale immediatamente prima dell'esecuzione il costruttore statico.
Ora, se abbiamo più classi partial
in file separati, l'ordine è determinato ovunque? Il mio istinto dice "non definito formalmente, ma probabilmente si riferisce all'ordine incluso nel csproj, o all'ordine annotato a csc". È corretto?
(e sì, mi rendo conto che sarebbe meglio evitare completamente l'ambiguità, probabilmente spostando tutte le inizializzazioni in un costruttore statico).
Per esempio, se ho 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();
}
}
e b.cs
:
partial class Program
{
private static int Bar = Write("Bar");
}
e:
<Compile Include="a.cs" />
<Compile Include="b.cs" />
allora questo è Foo
poi Bar
; se, tuttavia, questo è:
<Compile Include="b.cs" />
<Compile Include="a.cs" />
allora è Bar
poi Foo
. Questo supporta l'osservazione, ma non lo dichiara fortemente. §8.7.13 (Dichiarazioni di tipo parziale) non commenta l'ordine quando combina le classi partial
. Così; c'è qualcosa di più forte che possiamo dire qui, dalle specifiche del linguaggio C# o dalla documentazione degli strumenti?
Inoltre, si comporta allo stesso modo con csc a.cs b.cs
rispetto a csc b.cs a.cs
.
domanda molto bella –