я просматривал исходный код System.Linq.Expressions на GitHub и нашел following codeне Может ConstructorInfo иметь не DeclaringType
public static NewExpression New(ConstructorInfo constructor, IEnumerable<Expression> arguments)
{
ContractUtils.RequiresNotNull(constructor, nameof(constructor));
ContractUtils.RequiresNotNull(constructor.DeclaringType, nameof(constructor));
// ...
}
Я был смущен второй проверки нулевой, поэтому пошел в MSDN. Он должен был сказать следующее о ConstructorInfo.DeclaringType:
Свойство DeclaringType извлекает ссылку на объект Type для типа, объявляющего этого элемента. Элемент типа либо объявляется типом, либо унаследован от базового типа, поэтому объект Type, возвращаемый свойством DeclaringType, может быть не таким же, как объект Type, используемый для получения текущего объекта MemberInfo.
Если объект Type, из которого был получен этот объект MemberInfo, не объявил этот элемент, свойство DeclaringType будет представлять собой один из его базовых типов.
Если объект MemberInfo является глобальным членом (то есть, если он был получен из метода Module.GetMethods, который возвращает глобальные методы в модуле), возвращаемый DeclaringType будет иметь значение null.
Похоже, что DeclaringType может быть нулевым для MemberInfo (класса, из которого получен ConstructorInfo). Но я не уверен, может ли он быть null или нет для ConstructorInfo.
Так мои вопросы:
Может ConstructorInfo.DeclaringType когда-либо быть пустым? Почему код System.Linq.Expressions проверяет его?
Если DeclaringType может быть нулевым, можете ли вы привести пример?
Если DeclaringType может быть нулевым, означает ли это, что среда CLR поддерживает глобальные конструкторы? (Я попытался исследовать это, но ничего не могу найти)
3) Да - Поиск Инициализатора модуля или Конструктора модуля – thehennyy