您能告诉我如何解决该错误
默认参数值必须是编译时常量”
我知道问题所在,并且已经在Stack Overflow上看到了方法的解决方案,但是我不知道如何为类解决此问题。
public class member
{
public string name { get; }
public string email { get; set; }
public int entryYear;
static int memberNbr;
public member (string _name, int _entryyear = DateTime.Now.Year, string _email = "")
{
name = _name;
entryyear = _entryyear;
email = _email;
}
}
答案 0 :(得分:5)
与其让它成为可选参数,不如让其他构造函数重载怎么办?在第二个构造函数中,不要将entryYear作为参数,而是在构造函数主体中对其进行初始化?
在此过程中,让我们使用适当的C#约定,例如属性名称为PascalCase,构造函数参数为camelCased。并且不要对属性名称使用缩写,并且当MemberNumber明显属于单个实例时,也不要使其成为静态。
public class Member
{
public string Name { get; }
public string Email { get; }
public int EntryYear { get; }
public int MemberNumber {get; }
public Member(string name, int entryYear, string email = "")
{
Mame = Name;
EntryYear = entryYear;
Email = email;
}
public Member(string name, string email = "")
{
Mame = Name;
EntryYear = DateTime.Now.Year;
Email = email;
}
}
您没有询问,但是用空字符串初始化电子邮件实际上没有任何意义。最好将其默认设置为null。
答案 1 :(得分:3)
鉴于不可能将非恒定值作为默认参数,则必须使用重载:
public class Member
{
public string Name { get; }
public string Email { get; set; }
public int EntryYear { get; set; }
private int _memberNumber;
public Member(string name) : this(name, DateTime.Now.Year, "")
{ }
public Member(string name, int year) : this(name, year, "")
{ }
public Member(string name, string email) : this(name, DateTime.Now.Year, email)
{ }
public Member(string name, int entryYear, string email)
{
Name = name;
EntryYear = entryYear;
Email = email;
}
}
请注意,我已经为您修复了大写字母,您应该尽早学习c#约定。另外,_memberNumber
不应是静态的,除非所有成员具有相同的数字,这有点奇怪。
关于MemberNumber,您可能需要类似以下的基本信息:
public static class MemberHelpers
{
// you would have to load this if the data is persisted in some way
private static int _lastMemberNumber;
public static int GetNewMemberNumber()
{
return _lastMemberNumber++;
}
}
public Member(string name, int entryYear, string email)
{
Name = name;
EntryYear = entryYear;
Email = email;
_memberNumber = MemberHelpers.GetNewMemberNumber();
}
答案 2 :(得分:1)
您可以使用第二个构造函数。
public class member
{
public string name { get; }
public string email { get; set; }
public int entryYear = DateTime.Now.Year;
static int memberNbr;
public member(string _name, string _email = "")
{
name = _name;
email = _email;
}
public member(string _name, int _entryyear , string _email = "")
{
name = _name;
entryYear = _entryyear;
email = _email;
}
}
答案 3 :(得分:0)
一年是不明智的。 int.MinValue。因此,从理论上讲,您可以将默认参数设置为int.MinValue,并将其解释为DateTime.Now.Year。
但是,应该始终对代码进行优化以使其易于阅读,但这绝对不能使正在发生的事情变得显而易见。因此,我绝对不建议在公共API中执行此操作。尽管可以用私有方法,但是请确保记录下正在发生的事情。
如果在测试中使用int.MinValue这样的边缘情况,这也可能导致测试问题。
这样,我肯定会改为使用可为null的int,并使用默认参数null表示DateTime.Now.Year。
即使那样,我仍然会在公共API中建议不要这样做,而改为进行方法重载。但是,对于非公开代码,最好通过减少方法数量和使用默认参数来减少混乱。