C#. Почему DateTime.MinValue и MaxValue не являются константами времени компиляции?

Я хотел иметь необязательный параметр даты для метода (по умолчанию MinValue), чтобы проверить, действительно ли пользователь предоставил значение или нет (предоставление MinValue было недопустимым), но мне не разрешено, поскольку, по-видимому, это не компиляция -постоянная времени.

Согласно странице MSDN, "значение этого константа эквивалентна 00:00:00.0000000, 1 января 0001 года."

Так почему же это не константа времени компиляции? И чем это отличается от передачи Int32.MinValue, которая разрешена?


person Alex    schedule 28.07.2011    source источник
comment
@Downvoter Почему минус? Я чувствовал, что вопрос был ясен, имел точный ответ и имел отношение к сайту.   -  person Alex    schedule 28.07.2011


Ответы (2)


Вы не можете определить константу DateTime (или структуры). Из разрешенных типов MSDN для const:

Один из типов: byte, char, short, int, long, float, double, decimal, bool, string, тип перечисления или ссылочный тип.

person Vasea    schedule 28.07.2011
comment
@jazmatician DateTime является типом значения. См. msdn.microsoft.com/en- us/library/system.datetime(v=vs.110).aspx - person Vasea; 10.12.2013
comment
Я знал, что это неправильно, когда набирал это, но не мог понять, в чем дело. :) - person Michael Blackburn; 11.12.2013

Обходной путь: используйте значение NULL в качестве параметра. ИМО, в любом случае, это чище, поскольку специальное значение явно отличается, а не просто нормальное значение.

void A(DateTime? p=null)
{
}

Другая альтернатива:

void A(DateTime p=default(DateTime))
{
}

Что показывает, что параметр по умолчанию может использовать default(T) в качестве допустимого значения параметра по умолчанию для пользовательских типов.

Или просто перегрузите метод для другого количества параметров.

person CodesInChaos    schedule 28.07.2011
comment
это отвечает на мой подразумеваемый вопрос «как я могу делать то, что пытаюсь сделать?», спасибо :) - person Alex; 28.07.2011
comment
Вы можете попробовать использовать readonly, хотите убедиться, что значение не изменится. И я считаю, что это можно использовать в сочетании с нулевым типом ?. - person eternalmatt; 28.07.2011
comment
@eternalmatt Я не понимаю - как это помогает иметь необязательный параметр DateTime? Если это необязательно, ему потребуется значение по умолчанию, и, поскольку я не могу предоставить константу времени компиляции, кажется, что решение CodeInChaos является лучшим. - person Alex; 28.07.2011