使用OptionalAttribute声明为
的可选参数的简单C#方法namespace ClassLibrary11
{
public class Class1
{
public int Foo(int a, int b, [Optional] int c)
{
return a + b + c;
}
}
}
在VS 2010上。obj.Foo(3,4)
按预期输出7
。但不是在VS 2008或之前,除非使用DefaultParameterValue属性提供某些默认值。因此,在VS2008上或之前调用Foo(3,4)
会导致错误:
Object of type 'System.Reflection.Missing' cannot be converted to type 'System.Double'
在VS 2008和VS 2010上,如果使用反射来调用方法Foo,那么如果没有为可选参数提供默认值,则会抛出相同的错误。
ClassLibrary11.Class1 cls = new ClassLibrary11.Class1();
MethodInfo mi = typeof(ClassLibrary11.Class1).GetMethod("Foo");
Object[] objarr = new Object[] {1,2, Missing.Value};
Object res = mi.Invoke(cls, objarr);
所以问题是:
那么VS 2010编译器如何负责将默认值分配给可选参数,但框架4.0不通过反射?
答案 0 :(得分:7)
简单地说,这是因为C#3.5不支持可选参数。根据{{3}},
请注意,DefaultParameterValueAttribute不会将默认参数的支持添加到不支持此功能的语言。例如,如果将DefaultParameterValueAttribute与使用C#编写的方法一起使用,该方法不支持默认参数,则在从C#调用方法时不能使用default参数。
答案 1 :(得分:3)
在C#中使用.NET 4.0引入了可选参数,我不确定您使用VS 2008构建的目标是一个较旧的框架,但我想说你应该只在VS 2010和.NET 4.0中使用它们 Named and Optional Arguments