C# VS 2010与VS 2008中optionalAttribute(用于声明可选参数)行为的差异

C# VS 2010与VS 2008中optionalAttribute(用于声明可选参数)行为的差异,c#,.net,C#,.net,一个简单的C#方法,使用OptionalAttribute作为 namespace ClassLibrary11 { public class Class1 { public int Foo(int a, int b, [Optional] int c) { return a + b + c; } } } 关于VS 2010对象Foo(3,4)按预期输出7。但不是在VS2008或之前,除非使用DefaultParamet

一个简单的C#方法,使用OptionalAttribute作为

namespace  ClassLibrary11
{
   public class Class1
   {
      public int Foo(int a, int b, [Optional] int c)
      {
         return a + b + c;
      }
   }
}
关于VS 2010<代码>对象Foo(3,4)按预期输出
7
。但不是在VS2008或之前,除非使用DefaultParameterValue属性提供了一些默认值。因此,在VS2008上或之前调用
Foo(3,4)
会导致错误:

类型为“System.Reflection.Missing”的对象无法转换为类型为“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编译器是如何将默认值分配给可选参数的,而framework 4.0没有通过反射进行分配的呢?

可选参数是在C#的.NET 4.0中引入的,我不确定VS 2008针对较旧的框架构建的是什么,但我想说的是,您应该只在VS2010和.NET4.0中使用它们 简单地说,这是因为C#3.5不支持可选参数。根据,

请注意,DefaultParameterValueAttribute不会向不支持此功能的语言添加对默认参数的支持。例如,如果将DefaultParameterValueAttribute与不支持默认参数的C#编写的方法一起使用,则从C#调用该方法时不能使用默认参数