Segurança de thread de inicializadores estáticos em c #

Todo mundo diz que inicializadores estáticos são thread-safe, mas estou preocupado com um detalhe em particular.

Vamos dizer que eu tenho

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

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

Qual das seguintes opções C # garante, quandoMyStaticClass.myField ainda não está inicializado?

Se os tópicos 1 e 2 tentarem acessarmyField juntos (nessa ordem),GetNewObject terácomeçado executando antes do segmento 2 lêmyField.

Se os tópicos 1 e 2 tentarem acessarmyField juntos (nessa ordem),GetNewObject teráacabado executando antes do segmento 2 lêmyField.

Como sobre o CLR em geral: se suas garantias diferem dos C # 's, de que maneira eles diferem?
O comportamento mudou em versões mais recentes do .NET framework?

Nota:

É uma pergunta complicada, e acho que uma resposta completa provavelmente mencionaria a diferença entre umaconstrutor e uma estáticainicializadore como eles interagem combeforefieldinit para produzir o resultado reivindicado.

questionAnswers(2)

yourAnswerToTheQuestion