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

一个简单的C#方法,带有一个使用OptionalAttribute声明的可选参数

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上,如果使用reflection来调用方法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不通过reflection?

简单地说,这是因为C#3.5不支持可选参数。 根据MSDN ,

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

.NET 4.0在C#中引入了可选参数,我不确定您使用VS 2008构建的旧框架,但我想说您应该只在VS 2010和.NET 4.0中使用它们Named和Optional Arguments