Подтвердить что ты не робот

Параметр по умолчанию для значения должен быть константой времени компиляции?

Это моя подпись метода. При попытке передать end в качестве необязательного параметра он дает мне эту ошибку. Что я должен сделать, чтобы решить эту проблему? Почему не DateTime.MinValue константа?

public static void DatesToPeriodConverter(DateTime start, DateTime end = DateTime.MinValue, out string date, out string time)
4b9b3361

Ответ 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 как бизнес по умолчанию..

надеюсь, что это поможет,