In C# 4, the behavior of types without the beforefieldinit
flag was changed, so now a type initializer can call before first use of any static field of the class.
My questions are why has the C#/.NET team changed that behavior? What is the main reason? Can you show any practical example where this change makes any sense?
The behaviour has always been within the bounds of what's documented - it's just that it changed from being eager to lazy in .NET 4.
I suspect the JIT team managed to find a way to make it lazy without a performance penalty... or possibly it helps performance somewhere else. This is likely to only be one such change in behaviour within the .NET 4 CLR vs the .NET 2 CLR... it happens that I noticed it, but I doubt that many other people did. I think it's entirely reasonable for the JIT team to adjust things as they see fit, within the documented guarantees.
Ultimately, if this makes your code fail, you've got a bug already.