如何在C#中将参数默认为DateTime.MaxValue?

如何在C#中将参数默认为DateTime.MaxValue?,c#,c#-4.0,optional-parameters,C#,C# 4.0,Optional Parameters,我想说: public void Problem(DateTime optional = DateTime.MaxValue) { } 但是编译器抱怨DateTime.MaxValue不是编译时常量 DateTime.MinValue很简单,只需使用默认值(DateTime) 另见“ 我不希望使用方法重载,因为我试图驯服的方法有101个参数 您可以定义多个功能: public void Problem() { Problem(DateTime.MaxValue); } public

我想说:

public void Problem(DateTime optional = DateTime.MaxValue)
{
}
但是编译器抱怨DateTime.MaxValue不是编译时常量

DateTime.MinValue很简单,只需使用默认值(DateTime)

另见“


我不希望使用方法重载,因为我试图驯服的方法有101个参数

您可以定义多个功能:

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

如果调用Problem()(不带参数),该函数将使用参数调用另一个函数。

加载默认参数值是常量,即它不能是
字符串。Empty
/
Guid.Empty
等。可以使用方法重载:

void M(int intValue)
{
   M(intValue, Guid.Empty);
}
void M(int intValue, Guid guid)
{
   //do something
}
我不熟悉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");
    }
}
公共类FooBar
{
公共布尔问题
{
//创建默认的person对象
退货问题(新人());
}
公共空间问题(人)
{
//这里有些逻辑
返回true;
}
}
公共阶层人士
{
公共字符串名称{get;private set;}
public DateTime DOB{get;private set;}
公众人物(字符串名称,日期时间dob)
{
this.Name=Name;
this.DOB=DOB;
}
/// 
///默认构造函数
/// 
公众人士()
{
Name=“迈克尔”;
DOB=DateTime.Parse(“1980-07-21”);
}
}

简单的答案是,你不能使用我不认为是可选的参数

如果这是唯一的参数,则可以使用重载。如果这是一个具有许多可选参数的方法的示例,那么这可能是不可行的

您可以做的是将其设置为
DateTime?
并传递
null
,然后在方法中将
null
解释为
DateTime.MaxValue

这里有一篇关于可选论点的好文章,我将为你挖掘

编辑


我想用它来代替如下内容:

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

如您在一条注释中所述,如果您的方法有很多参数,那么您可以将它们全部转换为一个参数类并使用其属性初始值设定项。这样,您就不必初始化所有属性,您可以在该类的构造函数中将日期设置为
DateTime.MaxValue

您要求做的事情根本不可能
DateTime.MaxValue
不是编译时常量;它实际上是一个只读字段,在运行时由静态构造函数初始化。这在这里变得非常关键。可选参数需要编译时常量,因为它们将值直接烘焙到代码中


然而,真正的问题是您的方法需要101个参数。我从来没有见过有任何东西如此大声地要求重构。我的建议是将您的方法改为接受类的实例。这还将使您能够更灵活地为类的各个属性指定默认值。特别是,您可以指定非编译时常量的值。

根据您的一条评论,您正在尝试使带有101参数的方法更适合调用方。
我强烈建议您创建一个参数类,并使用默认值初始化该类的属性。为只接受一个参数的方法提供重载:参数类。

这将真正提高方法的使用率,因为如果用户只需要更改一个参数,甚至可以重用其参数类实例。

-1:您的建议非常糟糕,因为null通常被视为与
default(T)
等价。您的方法将极大地改变语义。正确的方法是使用重载,再加上
default(DateTime)
以及后续的内部检查,这是一个完全有效的替代方法。。。甚至用法也不会改变,因为给它一个null
DateTime?
仍然会触发默认值。如果该方法有许多参数,并且OP只是给出了一个问题的示例,则重载可能不可行。如果这是唯一的参数,则是重载更好。我只是建议,如果他想使用一个可选参数,我只是建议一个替代方案,因为我认为他不能以任何其他方式获得他想要的行为,并且仍然将其作为可选参数。@Adam:我说的是。当为一个参数调用一个空值的方法时,我不希望它被解释为
MaxValue
@Daniel,即使该参数被调用为
endDate
?我认为这一切都与背景有关。根据不同的情况,您可能希望null表示不同的内容,例如,对于EAX,请选择一个包含两个参数StartDate和EndDate的方法,这两个参数都可以为null,并且可能都默认为不同的值StartDate to DateTime.MinValue和EndDate to DateTime.MaxValue,这在特定情况下可能是合理的,事实上,我已经看过一个时间跨度的类,它正是这样做的。我只是给了OP一个选择,而不是明显的“制造过载”,如果是这样的话,我认为他会这么做simple@Ian:哈哈哈,天哪!!我认为你有一个完全不同的问题!使用参数类。101个参数@Ian Ringrose在任何给定的方法或构造函数中,参数不应超过5(?)。正如@Daniel所建议的,将这些参数抽象成ProblemsArgs类,并将其传入。@Ian Ringrose在传入args类时参见“编辑带示例”。@Sam Holder但是一个8.5k的OP怎么会在他的方法中有101个参数呢?我从来没有想到过。我真的很想知道为什么这看起来是最好的设计。那里似乎有一种疯狂的耦合。直观地说,如果你能为这样一种方法获得好的
代码度量标准,我会感到惊讶。@SamHolder引用杰瑞·宋菲尔德的话:“如果你有一件印有b的t恤衫