Как установить параметр DateTime.MaxValue в С# по умолчанию?

Я хочу сказать:

public void Problem(DateTime optional = DateTime.MaxValue)
{
}

Но компилятор жалуется, что DateTime.MaxValue не является постоянной времени компиляции.

DateTime.MinValue прост, просто используйте default (DateTime)

см. также "Как по умолчанию параметр Guid.Empty в С#?"

Я не хочу использовать перегрузку метода, поскольку метод, который я пытаюсь приручить, имеет 101 параметр!

Ответ 1

Я бы заменил это на что-то вроде:

public void Problem(DateTime? optional = null)
{
   DateTime dateTime = optional != null ? optional.Value : DateTime.MaxValue;
   // Now use dateTime
}

Ответ 2

Согласно одному из ваших комментариев, вы пытаетесь сделать метод с параметрами 101 более удобным для абонентов.
Я настоятельно рекомендую вам создать класс параметров и инициализировать свойства этого класса со значениями по умолчанию. Предоставьте перегрузку для вашего метода, который принимает только один параметр: класс параметров.
Это действительно улучшит использование вашего метода, поскольку пользователь может даже повторно использовать экземпляр класса параметров, если ему нужно изменить только один параметр.

Ответ 3

Вы можете определить несколько функций:

public void Problem()
{
     Problem(DateTime.MaxValue);
}
public void Problem(DateTime optional)
{
     // do your stuff here.
}

Если вы вызываете проблему() (без параметра), функция вызывает другую функцию с параметром.

Ответ 4

Я не знаком с С# 4.0, но в С# 3.5 я бы использовал перегрузку;

public void Problem()
{
    Problem(DateTime.MaxValue);
}
public void Problem(DateTime dt)
{
}

И назовите его с помощью:

Problem(); //defaults to maxvalue
Problem(myDateTime); //uses input value

Изменить: Просто чтобы ответить на некоторые из комментариев,

public class FooBar
{
    public bool Problem()
    {
        //creates a default person object
        return Problem(new Person());
    }

    public void Problem(Person person)
    {
        //Some logic here
        return true;
    }
}

public class Person
{
    public string Name { get; private set; }
    public DateTime DOB { get; private set; }
    public Person(string name, DateTime dob)
    {
        this.Name = name;
        this.DOB = dob;
    }

    /// <summary>
    /// Default constructor
    /// </summary>
    public Person()
    {
        Name = "Michael";
        DOB = DateTime.Parse("1980-07-21");
    }
}

Ответ 5

То, что вы просите, просто невозможно. DateTime.MaxValue не является константой времени компиляции; это фактически поле только для чтения, которое инициализируется во время выполнения статическим конструктором. Здесь difference становится здесь очень важным. Необязательные параметры требуют констант времени компиляции, поскольку они выпекают значение непосредственно в код.

Однако реальная проблема заключается в том, что ваш метод принимает 101 параметр. Я никогда не видел ничего громкого крика для рефакторинга. Моя рекомендация изменит ваш метод, чтобы принять экземпляр класса. Это также даст вам больше гибкости при определении значений по умолчанию для отдельных свойств класса. В частности, вы сможете указать значения, которые не являются константами времени компиляции.

Ответ 6

Простой ответ: вы не можете с дополнительными параметрами, я не думаю.

вы можете использовать перегрузку, если это единственный параметр. Если это пример метода со многими необязательными параметрами, это может оказаться невыполнимым.

Что вы можете сделать, это сделать его DateTime? и передать null, а затем интерпретировать null как DateTime.MaxValue в вашем методе.

Существует хорошая запись дополнительных аргументов, которые я выкопаю для вас.

EDIT

статья здесь

Ответ 7

Если, как вы указали в одном из своих комментариев, ваш метод имеет множество параметров, вы можете превратить их все в класс параметров и использовать его инициализаторы свойств. Тогда вам не придется инициализировать все свойства, и вы можете установить дату в DateTime.MaxValue в конструкторе этого класса.

Ответ 8

значения параметра loadDefault являются константами, то есть не могут быть string.Empty/Guid.Empty и т.д. Вы можете использовать перегрузку метода:

void M(int intValue)
{
   M(intValue, Guid.Empty);
}
void M(int intValue, Guid guid)
{
   //do something
}