'Object'不包含带0参数的构造函数

时间:2011-11-18 16:00:41

标签: c# constructor

在我的方法中,我有这个查询:

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参数的构造函数。有人可以帮我理解吗?

感谢。

6 个答案:

答案 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 
    ));