在我的方法中,我有这个查询:
var query =
_db.STEWARDSHIP
.OrderBy(r => r.SITE.SITE_NAME)
.Where(r => SiteId == null || r.SITE_ID == iSiteId)
.Where(r => SiteTypeId == null || r.SITE.SITE_TYPE_VAL.SITE_TYPE_ID == iSiteTypeId)
.Where(r => EcoregionId == null || r.SITE.ECOREGION_VAL.ECOREGION_ID == iEcoregionId)
.Where(r => ConservationAreaId == null || r.SITE.CONSERVATION_AREA_VAL.CONSERVATION_AREA_ID == iConservationAreaId)
.Where(r => VisitTypeId == null || r.VISIT_TYPE_VAL.VISIT_TYPE_ID == iVisitTypeId)
.Where(r => Staff == null || r.STAFF.Contains(sStaff))
.Where(r => Comment == null || r.VISIT_COMMENTS.Contains(sComment))
.Select(r => new SiteVisitDetails
{
Id = r.STEWARDSHIP_ID,
Name = r.SITE.SITE_NAME,
VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC,
VisitDate = r.VISIT_DATE
});
失败并显示错误:
SiteVisitDetails does not contain a constructor that takes 0 arguments
这里的课程:
public class SiteVisitDetails : ISiteVisitDetails
{
private int _id;
private string _name;
private DateTime _visitDate;
private string _visitType;
public SiteVisitDetails(int Id, string Name, DateTime VisitDate,
string VisitType)
{
_id = Id;
_name = Name;
_visitDate = VisitDate;
_visitType = VisitType;
}
public int Id
{
get { return _id; }
set { _id = value; }
}
public string Name
{
get { return _name; }
set { _name = value; }
}
public DateTime VisitDate
{
get { return _visitDate; }
set { _visitDate = value; }
}
public string VisitType
{
get { return _visitType; }
set { _visitType = value; }
}
public string getShortVisitDate()
{
return _visitDate.ToShortDateString();
}
}
界面:
interface ISiteVisitDetails
{
int Id { get; set; }
string Name { get; set; }
DateTime VisitDate { get; set; }
string VisitType { get; set; }
string getShortVisitDate;
}
我不明白为什么我需要一个带0参数的构造函数。有人可以帮我理解吗?
感谢。
答案 0 :(得分:9)
不明白为什么我需要一个取0的构造函数 参数。
表达式:
new SiteVisitDetails
{
Id = r.STEWARDSHIP_ID,
Name = r.SITE.SITE_NAME,
VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC,
VisitDate = r.VISIT_DATE
}
真的是简写:
new SiteVisitDetails() // Note the parantheses
{
Id = r.STEWARDSHIP_ID,
Name = r.SITE.SITE_NAME,
VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC,
VisitDate = r.VISIT_DATE
}
来自语言规范:
7.6.10.1对象创建表达式
[...]对象创建表达式可以省略构造函数参数列表 并且括起括号,前提是它包含一个对象初始值设定项 或集合初始化程序。 省略构造函数参数列表和 括号括起来等同于指定一个空参数 列表。强>
换句话说,你真的 试图调用SiteVisitDetails
类型的无参数构造函数,当然不存在。
答案 1 :(得分:3)
Foo result = new Foo { A = 1, B = 2 };
与
相同Foo temp = new Foo();
temp.A = 1;
temp.B = 2;
Foo result = temp;
如您所见,这涉及对无参数构造函数的调用。
如果你没有无参数构造函数,而是像
这样的构造函数public Foo(int a)
你需要像这样使用:
Foo result = new Foo(1) { B = 2 };
与
相同Foo temp = new Foo(1);
temp.B = 2;
Foo result = temp;
答案 2 :(得分:1)
我相信通过使用上面的符号来初始化{}内的每个项目,真正发生的是你的对象是用(不存在的)默认构造函数创建的,之后每个属性都被初始化。由于默认构造函数不存在,因此会出现异常。
答案 3 :(得分:1)
您正在使用对象初始值设定项,它允许您在构建期间分配任何可公开访问的字段。
new SiteVisitDetails
{
Id = r.STEWARDSHIP_ID,
Name = r.SITE.SITE_NAME,
VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC,
VisitDate = r.VISIT_DATE
});
转换为
var s = new SiteVisitDetails();
s.Id = blah;
s.Name = blah;
因此您需要一个空构造函数来使用该代码构造。
答案 4 :(得分:0)
好吧,你正试图在这里用0参数实例化类:
.Select(r => new SiteVisitDetails
答案 5 :(得分:0)
您通过默认构造函数(没有参数)明确创建对象的实例,然后使用大括号的语法糖来设置对象的属性:
.Select(r => new SiteVisitDetails
{
Id = r.STEWARDSHIP_ID,
Name = r.SITE.SITE_NAME,
VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC,
VisitDate = r.VISIT_DATE
}
尝试调用指定的构造函数...
public SiteVisitDetails(int Id, string Name, DateTime VisitDate, string VisitType)
...传递必填字段,然后使用类初始化程序设置您要设置的任何剩余字段:
.Select(r => new SiteVisitDetails(
Id = r.STEWARDSHIP_ID,
Name = r.SITE.SITE_NAME,
VisitType = r.VISIT_TYPE_VAL.VISIT_TYPE_DESC,
VisitDate = r.VISIT_DATE
));