C# BindingFlags.OptionalParameterBinding在不同的框架中有不同的行为。NET中的Bug?

C# BindingFlags.OptionalParameterBinding在不同的框架中有不同的行为。NET中的Bug?,c#,reflection,.net-3.5,.net-4.5,activator,C#,Reflection,.net 3.5,.net 4.5,Activator,我试图强制Activator.CreateInstance使用带有默认参数的构造函数 我发现这个建议重复了几次(第一条评论) 我想在Mono上运行它,但它不起作用,抛出了一个MissingMethodException。在提交bug之前,我在.NET 4.5上做了一个实验: class Program { static void Main(string[] args) { new A(); Activator.CreateInstance(type

我试图强制
Activator.CreateInstance
使用带有默认参数的构造函数

我发现这个建议重复了几次(第一条评论)

我想在Mono上运行它,但它不起作用,抛出了一个
MissingMethodException
。在提交bug之前,我在.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
参数,看看会发生什么,希望找到一种方法,用不同数量的默认参数调用构造函数

看到什么都没变,我大吃一惊!通过传递
新对象[]{}
我期望:

First
First
想知道打字的人都做了些什么,天哪!,为什么在互联网上的例子中提到了它,我已经改变了框架

在.NET4.0上是一样的,但在.NET3.5上结果是一样的

First
First
这似乎很奇怪。是否有记录在案的此类行为原因


调用可能有许多可选参数的构造函数的正确方法是什么?

我认为您无法做到这一点,可选参数是编译器实现的细节。查看MSDN文章中的BindingFlags,注意它说不能以这种方式使用OptionalParamBinding。是的,这是我首先关心的问题。只有我链接的这条由微软签署的评论,让我觉得文档中有一个bug。但这很奇怪,它是一个广泛使用的枚举的成员,只应在一个特定情况下使用。老实说,在我看来,这是一个非常奇怪的设计选择。另一方面,我理解可选参数的特殊性质。只是当我得到一个编译器可接受的选项时,我会尝试使用它;-)感谢您的评论。可选参数是从.NET 1.0开始的CLR的一部分。只有C#没有它们。@Hans为什么不能这样使用呢?