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
имущество.
... так что они не называют это конструктором.