Переполнение стека с помощью ToArray () - PullRequest
2 голосов
/ 14 июля 2011

Я получаю ошибку переполнения стека из последней строки приведенного ниже кода. Я не могу понять почему. Есть идеи?

        var slots = from a in db.AvailableAppointments
                    where a.RequestID == reqId
                    select new
                    DataLayer.DateAndTimeslot
                    {
                        date = a.Date.ToShortDateString(),
                        timeSlot = a.Timeslot
                    };

        returnValue.DateAndTimeslot = slots.ToArray();

Мой класс;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace DataLayer
{
    [DataContract(Namespace = "http://wholesale.fluidata.co.uk/bt/AppointmentAvailabilityResponse")]

    public class AppointmentAvailabilityResponse : DataLayer.WebserviceMessage
    {
        DateAndTimeslot[] _dateAndTimeSlot;

        [DataMember]
        public DateAndTimeslot[] DateAndTimeslot
        {
            get { return _dateAndTimeSlot; }
            set { _dateAndTimeSlot = value; }
        }

    }

    public class DateAndTimeslot
    {
        private String _date;
        private String _timeSlot;

        [DataMember]
        public string date 
        {
            get { return this._date; }
            set {_date = value;}
        }

        [DataMember]
        public string timeSlot
        {
            get { return this.timeSlot; }
            set {_timeSlot = value;}
        }

    }
}

Моя таблица (с примерами данных)

ID  RequestID   Date            Timeslot
171 3214    2005-12-28 00:00:00.000 EV
172 3214    2005-12-28 00:00:00.000 EV
173 3214    2005-12-29 00:00:00.000 EV
174 3214    2005-12-29 00:00:00.000 EV
175 3214    2005-12-30 00:00:00.000 EV
176 3214    2005-12-30 00:00:00.000 EV


CREATE TABLE [dbo].[AvailableAppointments](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [RequestID] [int] NOT NULL,
    [Date] [datetime] NOT NULL,
    [Timeslot] [varchar](21) NOT NULL,
 CONSTRAINT [PK_AvalibleAppointments] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

Ответы [ 2 ]

7 голосов
/ 14 июля 2011

Здесь:

[DataMember]
public string timeSlot
{
    get { return this.timeSlot; }
    set { _timeSlot = value; }
}

Заметили пропущенные _ в геттере и рекурсивный вызов?

Должно быть:

[DataMember]
public string timeSlot
{
    get { return this._timeSlot; }
    set { _timeSlot = value; }
}

И, кстатис тех пор, как я начал использовать автоматически реализованные свойства в C #, такие ошибки ушли в забвение:

[DataMember]
public string TimeSlot { get; set; }

Просто замечание со стороны: хорошая практика кодирования - начинать имена свойств сзаглавная буква (TimeSlot вместо timeSlot).

3 голосов
/ 14 июля 2011

Вот ваша рекурсия.Вам нужно _ здесь: get { return this.timeSlot; }

    public string timeSlot
    {
        get { return this.timeSlot; }
        set {_timeSlot = value;}
    }
...