Параметр по умолчанию для значения должен быть константой времени компиляции?
Это моя подпись метода. При попытке передать end
в качестве необязательного параметра он дает мне эту ошибку. Что я должен сделать, чтобы решить эту проблему? Почему не DateTime.MinValue
константа?
public static void DatesToPeriodConverter(DateTime start, DateTime end = DateTime.MinValue, out string date, out string time)
Ответы
Ответ 1
DateTime.MinValue
не является const
, потому что язык не нравится const
на DateTime
. Один из вариантов заключается в использовании DateTime?
вместо этого, т.е.
public static void DatesToPeriodConverter(DateTime start, DateTime? end = null,
out string date, out string time)
{
var effectiveEnd = end ?? DateTime.MinValue;
// ...
}
Однако у вас по-прежнему будет проблема с параметрами, отличными от параметров по умолчанию, после параметров по умолчанию - вам может потребоваться повторно заказать их для использования по умолчанию.
Ответ 2
Вместо этого используйте регулярные перегрузки методов:
public static void DatesToPeriodConverter(DateTime start, out string date, out string time)
{
DatesToPeriodConverter(start, DateTime.MinValue, out date, out time);
}
public static void DatesToPeriodConverter(DateTime start, DateTime end, out string date, out string time)
{ }
Поверенно, default(DateTime)
совпадает с DateTime.MinValue
и является константой времени компиляции, но я склонен ошибаться от использования этого стиля (в будущем нет гарантии, что default(DateTime)
будет равно DateTime.MinValue
):
public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)
Или, как предлагает Marc, используйте DateTime?
, который позволяет использовать значение null
по умолчанию.
Ответ 3
Вы можете попробовать сделать это следующим образом:
public static void DatesToPeriodConverter(DateTime start, DateTime? end , out string date, out string time)
{
if(!end.HasValue){
end = DateTime.MinValue;
}
}
Ответ 4
Измените тип конца параметра на Nullable и используйте значение null в качестве значения по умолчанию:
public static void DatesToPeriodConverter(DateTime start, DateTime? end = null, out string date, out string time)
или использовать значение по умолчанию (DateTime) в качестве значения по умолчанию:
public static void DatesToPeriodConverter(DateTime start, DateTime end = default(DateTime), out string date, out string time)
Ответ 5
Вы правы. Параметр по умолчанию для значения должен быть константой времени компиляции. Динамически вычисленное значение не принимается компилятором по сравнению с необязательным параметром. Причина этого может заключаться в том, что не обязательно, что динамическое значение, которое вы предоставляете, даст некоторое допустимое значение.
Ответ 6
Дополнительные параметры должны появиться в конце списка параметров. выходы должны также отображаться в конце списка параметров. Ваш необязательный параметр не является параметром out.
Кроме того, вы не можете использовать значения по умолчанию для необязательных параметров, отличных от константных констант, и нескольких странных угловых случаев.
Все факты указывают в следующем направлении:
- Создайте вторичный метод перегрузки.
- Сделать начальный метод не включать параметр
- Сделать вторичным включить параметр
- Вызовите свой более общий метод (тот, у которого есть параметр) от вашего более конкретного
и реализовать логику только в более общем
Ответ 7
мы можем создать класс CONSTANTS со значениями по умолчанию
public const int DEFAULTINT = -9999;
и использовать их как CONSTANTS.DEFAULTINT как бизнес по умолчанию..
надеюсь, что это поможет,