Le CLR ne prend pas en charge l'initialisation de champs de ce type. Pour le faire fonctionner, le compilateur C# réécrit votre constructeur. L'IL ressemble à ceci:
IL_0000: ldarg.0
IL_0001: newobj instance void ConsoleApplication1.Bar::.ctor()
IL_0006: stfld class ConsoleApplication1.Bar ConsoleApplication1.Foo::bar
IL_000b: ldarg.0
IL_000c: call instance void [mscorlib]System.Object::.ctor()
IL_0011: ret
Notez que le constructeur est appelé Bar avant le constructeur de base Foo. Quelle est la différence avec votre autre extrait, là le constructeur de base Foo est appelé par la suite. Cela fera rarement une différence, sauf si le champ est hérité et le constructeur de la classe de base fait quelque chose avec lui.
Ou si les initialiseurs de champ dépendent les uns des autres, ils sont initialisés dans un ordre textuel strict. Vous pouvez contrôler l'ordre en le faisant explicitement dans le constructeur.
http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at-declaration – SwDevMan81
http://stackoverflow.com/questions/1157201/initializing-class -fields-at-the-field-definition-ou-in-class-contructor – SwDevMan81