2011-03-09 109 views
8

帶有可選參數A簡單的C#方法使用OptionalAttribute作爲差(用於聲明可選參數)在2010年VS VS VS 2008

namespace ClassLibrary11 
{ 
    public class Class1 
    { 
     public int Foo(int a, int b, [Optional] int c) 
     { 
     return a + b + c; 
     } 
    } 
} 

在2010 VS obj.Foo(3,4)輸出7聲明如預期。但不是在VS 2008或之前,除非有一些默認值是使用DefaultParameterValue Attribute提供的。因此,在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通過反射不?

回答

3

可選參數已經推出了.NET 4.0在C#中,我不知道你是在VS 2008構建靶向舊的框架,但我會說你應該只在VS 2010中使用它們和.NET 4.0 Named and Optional Arguments

7

簡而言之,這是因爲C#3.5不支持可選參數。按照MSDN,

請注意,DefaultParameterValueAttribute不會將默認參數支持添加到不支持此功能的語言。例如,如果使用DefaultParameterValueAttribute和用C#編寫的方法(不支持默認參數),則在從C#調用方法時不能使用默認參數。