Seguridad de subprocesos de inicializadores estáticos en C #

Todos dicen que los inicializadores estáticos son seguros para subprocesos, pero me preocupa un detalle en particular.

Digamos que tengo

static class MyStaticClass
{
    public static readonly object myField = MyOtherClass.GetNewObject();
}

static class MyOtherClass
{
    public static object GetNewObject()
    { /* arbitrary code that returns a new object */ }
}

¿Cuál de los siguientes garantiza C #, cuandoMyStaticClass.myField aún no está inicializado?

Si los hilos 1 y 2 intentan accedermyField juntos (en ese orden),GetNewObject tendráempezado ejecutando antes del hilo 2 lecturasmyField.

Si los hilos 1 y 2 intentan accedermyField juntos (en ese orden),GetNewObject tendráterminado ejecutando antes del hilo 2 lecturasmyField.

¿Qué hay del CLR en general: si sus garantías difieren de las de C #, en qué se diferencian?
¿Ha cambiado el comportamiento en las versiones más recientes de .NET framework?

Nota:

Es una pregunta difícil, y creo que una respuesta completa probablemente mencionaría la diferencia entre una estáticaconstructor y una estáticainicializador, y como interactúan conbeforefieldinit Para producir el resultado reivindicado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta