默认参数必须是编译时常量

时间:2014-06-25 21:45:22

标签: c# datetime compiler-errors

我想创建一个具有可选参数的方法。我写的程序需要这些是DateTime形式。我目前的方法声明是

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

但是,我收到此错误"'月'的默认参数值必须是编译时常量。"

如何修复此错误?在调用之前,我是否需要在方法之外设置这些值?

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

如果您不想事先设置它,我认为您必须传递一组不同的默认值:

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

答案 2 :(得分: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);
}

答案 3 :(得分:0)

。现在不是常数,因此您不能将其用作默认值。

我建议默认为null,然后如果值为null,则在运行时获取默认值。

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