Как мне по умолчанию параметр DateTime.MaxValue в C #? - PullRequest
11 голосов
/ 04 апреля 2011

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

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

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

DateTime.MinValue легко, просто используйте значение по умолчанию (DateTime)

см. Также " Как мне установить для параметра по умолчанию значение Guid.Empty в C #? "

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

Ответы [ 8 ]

9 голосов
/ 04 апреля 2011

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

public void Problem(DateTime? optional = null)
{
   DateTime dateTime = optional != null ? optional.Value : DateTime.MaxValue;
   // Now use dateTime
}
5 голосов
/ 04 апреля 2011

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

3 голосов
/ 04 апреля 2011

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

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

3 голосов
/ 04 апреля 2011

Я не знаком с C # 4.0, но в c # 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");
    }
}
3 голосов
/ 04 апреля 2011

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

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

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

2 голосов
/ 04 апреля 2011

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

2 голосов
/ 04 апреля 2011

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

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

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

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

РЕДАКТИРОВАТЬ

статья здесь

1 голос
/ 04 апреля 2011

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

void M(int intValue)
{
   M(intValue, Guid.Empty);
}
void M(int intValue, Guid guid)
{
   //do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...