小编Mcg*_*iya的帖子

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;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

在VS 2010上.按预期obj.Foo(3,4)输出7.但不是在VS 2008或之前,除非使用DefaultParameterValue属性提供某些默认值.因此,Foo(3,4)在VS2008上或之前调用会导致错误:

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);
Run Code Online (Sandbox Code Playgroud)

所以问题是:

那么VS 2010编译器如何负责将默认值分配给可选参数,但框架4.0不通过反射?

.net c#

8
推荐指数
2
解决办法
4133
查看次数

标签 统计

.net ×1

c# ×1