2014-06-25 59 views
0

我想創建一個具有可選參數的方法。我正在編寫的程序需要使用DateTime格式。我目前的方法聲明是默認參數必須是編譯時常量

public void UpdateTable(int month = DateTime.Now.Month, int year = DateTime.Now.Year) 
    { 
     // Code here. 
    } 

但是,我收到此錯誤「默認參數值爲'月'必須是編譯時常量。」

我該如何解決這個錯誤?在調用它之前,我需要在方法之外設置這些值嗎?

+0

'DateTime.Now'取決於當它是在執行期間調用,所以它不是編譯時常量。 – Tim

回答

0

如果您不想預先設置的話,我想你會在不同的默認設置的經過:

public void UpdateTable(int month = -1, int year = -1) 
    { 
     if (month == -1) month = DateTime.Now.Month; 
     if (year == -1) year = DateTime.Now.Year; 
    } 
1

DateTime.Now將會有所不同,當然,每次程序運行時 - 所以它不能用作默認值。

解決這個問題的一種方法是使用帶有不同參數計數的重載函數。

public void UpdateTable(int month, int year) 
{ 
    // Code here. 
} 

public void UpdateTable(int month) 
{ 
    // fill in the current year 
    UpdateTable(month, DateTime.Now.Year); 
} 

public void UpdateTable() 
{ 
    // fill in the current month/year 
    UpdateTable(DateTime.Now.Month, DateTime.Now.Year); 
} 
0

你不能那樣做。如錯誤所示,可選參數的默認值必須在編譯時確定。

可以使用nullable typeint?),像這樣:

public void UpdateTable(int? month = null, int? year = null) 
{ 
    month = month ?? DateTime.Now.Month; 
    year = year ?? DateTime.Now.Year; 
    // Code here. 
} 

但我建議你做超載,像這樣:

public void UpdateTable(int month, int year) 
{ 
    // Code here. 
} 
public void UpdateTable(int month) 
{ 
    UpdateTable(month, DateTime.Now.Year); 
} 
public void UpdateTable() 
{ 
    UpdateTable(DateTime.Now.Month, DateTime.Now.Year); 
} 
+0

如果您希望能夠在一個月或一年中通過,那麼情況如何?您不能有兩個採用相同參數集的重載。這就是爲什麼違約是如此有用;您可以更好地控制發送的參數。 –

+0

@Francine是的,這取決於OP正在建造什麼樣的API。這就是爲什麼我包含這兩個選項。如果它是我的代碼,我還會考慮使用兩種不同的方法,'UpdateTableMonth'和'UpdateTableYear'來完全避免混淆,或者更好的方法是,如果可能的話,只需要一個'DateTime'的方法。 –

0

。現在是不是一個常數,所以你不能將其用於默認值。

我建議默認爲null,然後如果值爲null,則在運行時獲取默認值。

public void UpdateTable(int? month = null, int? year = null) 
{ 
    month = month ?? DateTime.Now.Month; 
    year = year ?? DateTime.Now.Year; 
    // Code here. 
} 
+0

這條線做什麼? 月=月? DateTime.Now.Month ?; – Ultracoustic

+0

@Ultra你問關於空合併運算符(??)? http://msdn.microsoft.com/en-us/library/ms173224.aspx – LVBen

+0

?? //總結:如果左操作數不爲空,則返回左操作數。如果左操作數爲空,則返回右操作數。所以,對於「月份=月份」DateTime.Now.Month;「行,如果month爲null,則將month設置爲DateTime.Now.Month,如果month不爲null,則它保持不變。 – LVBen

相關問題