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为什么不能这样使用呢?