MethodBase.IsConstructor не работает как указано для статического конструктора

Просто простое наблюдение. СобственностьMethodBase.IsConstructor не работает с static конструкторы, и документация не упоминает этот факт (цитата: "истина, если этот метод является конструктором, представленным ConstructorInfo объект ").

Образец:

static class Program
{
  static void Main()
  {
    ConstructorInfo ci = typeof(Test).GetConstructor(
        BindingFlags.NonPublic | BindingFlags.Static, null, new Type[] { }, null);
    Console.WriteLine(ci is ConstructorInfo); // silly; writes True
    Console.WriteLine(ci.IsConstructor);      // ??     writes False
  }
}

static class Test
{
  static Test()
  {
    Console.WriteLine("I am your static constructor");
  }
}

Вопрос: почему? Ошибка или неполная спецификация?

1 ответ

Решение

"Статический конструктор" - это всего лишь терминология C#. В самом.NET есть инициализатор типа (согласно Type.TypeInitializer). Тип может иметь инициализатор типа без статического конструктора, объявленного в C# - например, для инициализации статической переменной.

Наличие статического конструктора в исходном C# имеет два эффекта:

  • Удаляет beforefieldinit флаг от типа, потенциально меняющий время
  • Он добавляет код в инициализатор типа

Так что пока он представлен ConstructorInfo Я не особенно удивлен, что IsConstructor возвращает false, поскольку это не конструктор в терминологии CLR. Это не конструктор, представленный ConstructorInfo объект:) Конечно, было бы яснее, если бы документ был перефразирован так: "если этот метод является конструктором экземпляра" - а также если GetConstructor не вернул (как это довольно противоречиво, IMO).

По общему признанию документы для GetConstructor сделать состояние:

Чтобы получить инициализатор класса (.cctor) с использованием перегрузки этого метода, необходимо указать BindingFlags.Static | BindingFlags.NonPublic, Вы также можете получить инициализатор класса, используя TypeInitializer имущество.

... так что они не называют это конструктором.

Другие вопросы по тегам