Этот вопрос уже имеет ответ здесь:
Если DateTime является объектный и C# по умолчанию, параметры могут только быть присвоенными константами времени компиляции, как Вы обеспечиваете значения по умолчанию для объектов как DateTime?
Я пытаюсь инициализировать значения в ПОСТЕПЕННО с конструктором, с помощью названный параметрами со значениями по умолчанию.
DateTime
не может использоваться как константа, но вместо этого вы можете сделать его типом, допускающим значение NULL ( DateTime?
).
Задайте для DateTime?
значение по умолчанию null
, и если оно установлено на null
в начале вашей функции, вы можете инициализировать его к любому значению, которое вы хотите.
static void test(DateTime? dt = null)
{
if (dt == null)
{
dt = new DateTime(1981, 03, 01);
}
//...
}
Вы можете вызвать его с именованным параметром, например так:
test(dt: new DateTime(2010, 03, 01));
И с параметром по умолчанию, например так:
test();
В отличие от VB, C # не поддерживает литералы даты. И поскольку необязательные параметры выглядят так в IL, вы не можете подделать их с помощью атрибутов.
.method private hidebysig static void foo([opt] int32 x) cil managed
{
.param [1] = int32(5)
.maxstack 8
L_0000: nop
L_0001: ret
}
.method //this is a new method
private hidebysig static //it is private, ???, and static
void foo //it returns nothing (void) and is named Foo
([opt] int32 x) //it has one parameter, which is optional, of type int32
.param [1] = int32(5) //give the first param a default value of 5
Единственный способ сделать это напрямую - использовать значение default(DateTime)
, которое является константой времени компиляции. Или вы можете обойти это, используя DateTime?
и установив значение по умолчанию на null
.
См. также этот смежный вопрос о TimeSpan
.