我想说:
public void Problem(DateTime optional = DateTime.MaxValue)
{
}
但编译器抱怨DateTime.MaxValue不是编译时常量。
DateTime.MinValue很简单,只需使用默认(DateTime)
另见“How do I default a parameter to Guid.Empty in C#?”
我不想使用方法重载,因为我试图驯服的方法有101个参数!
答案 0 :(得分:9)
我会用这个代替:
public void Problem(DateTime? optional = null)
{
DateTime dateTime = optional != null ? optional.Value : DateTime.MaxValue;
// Now use dateTime
}
答案 1 :(得分:5)
根据您的一条评论,您尝试使用 101 参数的方法更适用于来电者。
我强烈建议您创建一个参数类并使用默认值初始化该类的属性。为只接受一个参数的方法提供重载:参数类
这将真正改善方法的使用,因为如果用户只需要更改一个参数,用户甚至可以重用其参数类实例。
答案 2 :(得分:3)
您可以定义多个功能:
public void Problem()
{
Problem(DateTime.MaxValue);
}
public void Problem(DateTime optional)
{
// do your stuff here.
}
如果调用Problem()(不带参数),该函数会使用参数调用另一个函数。
答案 3 :(得分:3)
我不熟悉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");
}
}
答案 4 :(得分:3)
你要求做的事情根本不可能。 DateTime.MaxValue
不是编译时常量;它实际上是一个只读字段,由运行时由静态构造函数初始化。 difference在这里变得非常关键。可选参数需要编译时常量,因为它们将值直接烘焙到代码中。
然而,真正的问题是你的方法需要101个参数。我从未见过任何因为重构而大声哭泣的事情。我的建议是改变你的方法来接受一个类的实例。这也可以让您更灵活地为类的各个属性指定默认值。特别是,您将能够指定不编译时常量的值。
答案 5 :(得分:2)
简单的答案是你不能用可选参数我不认为。
如果这是唯一的参数,你可以使用重载。如果这是具有许多可选参数的方法的示例,那么这可能是不可行的。
您可以做的是将其设为DateTime?
并传递null
,然后在您的方法中将null
解释为DateTime.MaxValue
。
有一个很好的可选参数的写法,我会为你挖掘。
编辑
答案 6 :(得分:2)
如果您在其中一条评论中说过,您的方法有很多参数,您可以将它们全部转换为参数类并使用其属性初始值设定项。然后,您不必初始化所有属性,并且可以在该类的构造函数中将日期设置为DateTime.MaxValue
。
答案 7 :(得分:1)
loadDefault参数值是常量,也就是说,它不能是string.Empty
/ Guid.Empty
等等。您可以使用方法重载:
void M(int intValue)
{
M(intValue, Guid.Empty);
}
void M(int intValue, Guid guid)
{
//do something
}