BindingFlags.OptionalParameterBinding различное поведение в разных структурах. Ошибка в.NET?

Я пытался заставить Activator.CreateInstance использовать конструктор с параметрами по умолчанию.

Я нашел это предложение, повторенное несколько раз на SO (первый комментарий) http://connect.microsoft.com/VisualStudio/feedback/details/521722/system-activator-createinstance-throws-system-missingmethodexception-with-constructor-containing-an-optional-parameter

Я хотел запустить его на Моно, и это не сработало, бросая MissingMethodException, Перед отправкой сообщения об ошибке я провел эксперимент на.NET 4.5:

class Program
{
    static void Main(string[] args)
    {
        new A();
        Activator.CreateInstance(typeof(A),
            BindingFlags.CreateInstance 
            | BindingFlags.Public 
            | BindingFlags.Instance
            | BindingFlags.OptionalParamBinding,
            null, new Object[] {Type.Missing}, null);
    }
}
class A
{
    public A()
    {
        Console.WriteLine("First");
    }
    public A(int i = 5)
    {
        Console.WriteLine("Second");
    }
}

Конечно, результат был предсказуем:

First
Second

Затем я попытался удалить Type.Missing параметр, чтобы увидеть, что происходит, в надежде найти способ вызвать конструктор с переменным количеством параметров по умолчанию.

Я был поражен, увидев, что ничего не изменилось! Мимоходом new Object[]{} Я ожидал:

First
First

Интересно, что делает Type.Missing, и, черт возьми!, почему это упоминается в примерах через Интернет, я изменил структуру.

На.NET 4.0 было то же самое, НО на.NET 3.5 результат был

First
First

Это кажется очень странным. Есть ли документированные причины такого поведения?

Как правильно вызывать конструктор с возможно большим количеством необязательных параметров?

0 ответов

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