【问题标题】:'Object' does not contain a constructor that takes 0 arguments [duplicate]“对象”不包含带 0 个参数的构造函数 [重复]
【发布时间】:2012-01-01 09:12:02
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • C# 和默认构造函数有一点关系。结构将有自己的、不可重载的默认构造函数。使用泛型,您只能使用默认构造函数(where 语句末尾的“new()”子句)构造类型 T 的对象,并且我看到的所有 WPF 都是使用该默认构造函数构造的,它们的参数在之后设置,一一……

标签: c# constructor


【解决方案1】:

好吧,您正在尝试在这里用 0 个参数实例化类:

.Select(r => new SiteVisitDetails 

【讨论】:

    【解决方案2】:

    不明白为什么我需要一个取 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类型的无参数构造函数,当然它不存在。

    【讨论】:

      【解决方案3】:

      我相信通过使用上面的符号来初始化 { } 中的每个项目,真正发生的是您的对象是使用(不存在的)默认构造函数创建的,然后每个属性都被初始化。由于默认构造函数不存在,因此您会遇到异常。

      【讨论】:

        【解决方案4】:
        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;
        

        【讨论】:

          【解决方案5】:

          您正在使用对象初始化器,它允许您在构造期间分配任何可公开访问的字段。

          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;
          

          所以您需要一个空的构造函数来使用该代码构造。

          【讨论】:

            【解决方案6】:

            您正在通过其默认构造函数(不带参数)明确创建对象的实例,然后使用大括号的语法糖来设置对象的属性:

             .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 
                ));
            

            【讨论】:

              猜你喜欢
              • 2014-04-14
              • 2012-08-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-02-17
              相关资源
              最近更新 更多