2012-06-07 48 views
2

我有這樣的方法可選C#參數問題

public static void WriteErrorLog(LogEntry logEntry, string method, [Optional, DefaultParameterValue(0)] int? errorTypeID) 

因此,我希望我可以調用像

WriteErrorLog(l, "text"); 

的方法,但我得到的Visual Studio中的錯誤反正:(

方法'WriteErrorLog'沒有超載需要2個參數

我錯過了什麼?

謝謝!

+0

你編譯哪個.NET框架? – kol

+0

無法在VS2012rc,.NET 4.5中重現 - 您正在使用哪些版本(VS,.NET等)? –

+0

@Damien_The_Unbeliever我已經使用VS2010 .NET 4.0 –

回答

16

你不應該使用[Optional, DefaultParameterValue(0)]。相反,你應該使用C風格的默認參數語法:

public static void WriteErrorLog(LogEntry logEntry, string method, int? errorTypeID = 0) 

而且,如果errorTypeIdNullable,那麼你不應該有默認值是null

public static void WriteErrorLog(LogEntry logEntry, string method, int? errorTypeID = null) 
6

你是問題是,[Optional]是不是你如何使它可選。請嘗試:

public static void WriteErrorLog(LogEntry logEntry, string method, [Optional, DefaultParameterValue(0)] int? errorTypeID = null) 

可選參數在C#4.0中添加並且是方法重載的簡單替代方法。在引擎蓋下,它會在您打電話給包含您給定的默認值的呼叫時進行擴展。您可以保留[Optional]屬性。它根本沒有傷害。事實上,我不確定它是否做了任何事情。如果我不得不猜測它是通過標記可以省略的重載來使重載更易於使用,因爲另一個重載爲您處理了默認值。

3

您需要說明的可選參數是這樣的:

public static void WriteErrorLog(LogEntry logEntry, 
    string method, int? errorTypeID = 0) 

這將正確編譯。

0

如果使用.NET 4(或更新版本):

public static void WriteErrorLog(LogEntry logEntry, string method, int? errorTypeID = null) 

注意,可空類型的 「默認」 值爲null。在C中,人們通常使用-1或0作爲整數的默認值,這就是您可以在C#中使用空值更乾淨地執行的操作。 AFAIK在Haskell和其他語言中有類似的地方。

0

我不知道它爲什麼不適合你。我完全按照您鍵入的方式複製了方法參數。我使用VS2010和.NET 4.0。我運行了代碼,每次都能正常工作。

無論如何,您應該使用C風格的默認參數。但是這種方法仍然適用於我。然而,我得到一個紅色的下劃線,並懸停顯示相同的錯誤。但是當我運行代碼時,一切都按照它應該的方式工作。