Обновление: Это выглядит как красная селедка компилятора, так как на самом деле это действительно так:
const int MyInt = default(int);
Проблема заключается в том, что DateTime
не является допустимым const
, а не использованием default
.
Основной источник путаницы для меня не понимал, что default(DateTime)
обрабатывается специально в необязательных параметрах (и я пришел к ложному выводу о том, что default(DateTime)
рассматривался как константа времени компиляции из-за сообщения об ошибке опуская другие возможные условия). Это ответ Марцин Джурашек в его ответе.
Оригинальный вопрос:
Это бесстыдно разорвано из комментария от Марка Гравелла от этого ответа к другому вопросу.
Почему допустимо следующее:
// No compiler errors, default(DateTime) seems to satisfy the compile-time constant requirement.
public static void DoSomething(DateTime date = default(DateTime))
{
}
Но не следующее:
// Compiler error: "Constant initializer must be compile-time constant.
const DateTime MyDate = default(DateTime);
Как представляется, как бы хотят "константы времени компиляции" (очевидно, если вы попытаетесь предоставить что-то вроде DateTime.MinValue
для необязательного параметра, компилятор жалуется, что он не является константой времени компиляции):
// Compiler error: Default parameter value for 'date' must be a compile-time constant.
public static void DoSomething(DateTime date = DateTime.MinValue) {}
Что происходит за кулисами, из-за чего компилятор обрабатывает их по-другому?