Массив F # создается с 5 элементами, но не с 6 - PullRequest
6 голосов
/ 22 февраля 2012

Я новичок в F #, поэтому я, вероятно, упускаю что-то тривиальное, но здесь идет.

Это работает -

let monthsWith31Days = [| MonthType.January; 
                          MonthType.March;
                          MonthType.May;
                          MonthType.July;
                          MonthType.December |]

Но это не

let monthsWith31Days = [| MonthType.January; 
                          MonthType.March;
                          MonthType.May;
                          MonthType.July;
                          MonthType.August;
                          MonthType.December |]

Что я заметил, так это то, что это не сам контент, а количество элементов, которыеимеет значение (даже если я изменю фактические используемые элементы).Проблема начинается, когда количество элементов превышает 5.

Это ошибка, которую я получаю при запуске моих тестов NUnit -

System.ArgumentException: значение не попадает в ожидаемый диапазон.

Есть идеи, что мне не хватает?

Редактировать:

Полное определение типа (два типа связаны, поэтому оба показаны здесь) -

type public Month(monthType:MonthType, year:Year) = 
        member public this.Year 
            with get () = year
        member public this.MonthType 
            with get () = monthType

        member public this.GetDaysCount () = 
            let monthsWith31Days = [| MonthType.January; 
                                      MonthType.March;
                                      MonthType.May;
                                      MonthType.July;
                                      MonthType.August;
                                      MonthType.December |]

            let has31 = monthsWith31Days |> Array.filter(fun n -> (int)n = (int)this.monthType) |> Array.length

            if (has31 > 0)
            then 31
//            else if (this.MonthType = MonthType.February)
//            then (if this.Year.Leap then 29 
//                  else 28)
            else 30


    and public Year(ad:int) = 
        member public this.AD
            with get() = ad

        member public this.Months = Enum.GetValues(typeof<MonthType>).Cast().ToArray()
                                    |> Array.map(fun n -> new Month (n, this))

        member public this.GetMonth (index:int) = 
            (this.Months |> Array.filter(fun p-> (int)p.MonthType = index)).First()

        member public this.GetMonth (monthName:string) = 
            let requiredMonthType = Enum.Parse(typeof<MonthType>, monthName) |> unbox<MonthType>
            (this.Months |> Array.filter(fun p-> p.MonthType = requiredMonthType)).First()

        member public this.Leap = 
            if this.AD % 400 = 0 then true
            else if this.AD % 100 = 0 then false
            else if this.AD % 4 = 0 then true
            else false

        member this.DaysCount = if this.Leap then 366 else 365

1 Ответ

6 голосов
/ 22 февраля 2012

На самом деле я смутно припоминаю некоторую ошибку при создании литералов массива, полных перечислений, на какой-то целевой платформе CLR, где, если у вас было больше 5, то генерировался какой-то плохой код или что-то в этом роде. Может быть, вы бьете это? Вы нацеливаетесь на x64 и CLR2? Вы можете обойти ошибку, избегая литералов массива, и использовать, например, список, а затем позвоните List.ToArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...