F # Array creates instances with 5 elements but not with 6

I am new to F #, so I probably missed something trivial, but here.

It works -

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

But it is not

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

I noted that this is not the content itself, but the number of elements that matter (even if I change the actual elements used). The problem begins when the number of elements exceeds 5.

This is the error I get when I run NUnit tests -

System.ArgumentException: value is not in the expected range.

Any ideas what I am missing?

Edit:

Definition of the whole type (two types are connected so that both are shown here) -

 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 
+6
source share
1 answer

Actually, I vaguely recall a mistake about creating array literals full of enumerations on some target CLR platform, where if you had more than 5 then some bad code or something like that was created. Maybe you scare it? Are you targeting x64 and CLR2? You can work around the error by avoiding array literals and use, for example, a list, and then call List.ToArray .

+6
source

Source: https://habr.com/ru/post/909040/


All Articles