Первое, что здесь происходит при загрузке класса, это
static Single s = new Single();
C # выполняет статические инициализаторы, подобные этому, в порядке их просмотра.Я не уверен, применима ли эта точка упорядочения и к статическому конструктору, но из вашего теста кажется, что статический инициализатор действительно имеет место перед статическим конструктором.
В любом случае, чтобы назначить статические значения Single, необходимо сначала создать новый метод Single (), что означает вызов нестатического конструктора.Я не уверен, что бы вы получили, если бы читали из Single.s в нестатическом конструкторе, но я ожидал бы либо ноль, либо исключение.