Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

InvalidOperationException in Fsharp.Core.dll

So I am doing a simple personal project in winforms with F#. My code used to work, but now throws this exception for seemingly no reason.

An unhandled exception of type 'System.InvalidOperationException' occurred in FSharp.Core.dll

 Additional information: The initialization of an object or value resulted in an object or value being accessed recursively before it was fully initialized.

The code is a member method that is being invoked from the constructor of the form itself

    do
 //lots of other constructor code before this point
 // render the form
        form.ResumeLayout(false)
        form.PerformLayout()
        form.ReloadGoals



//several other members before here
    member form.ReloadGoals  =
        let x = 10  //crashes on this line

The website where I grabbed the template for the project I am using is this one. Unfortunately I have made some substantial additions to this.

I would be glad to post more code, but I need to know what code would be relevant exactly, as I am not exactly sure and don't want to bog down the post in extraneous code.

Also I can't really find a lot of documentation on System.InvalidOperationException. Every time I find it, it is being used as an example of an exception you can throw on your own, not what causes it.

like image 598
Alexander Ryan Baggett Avatar asked Dec 15 '22 17:12

Alexander Ryan Baggett


1 Answers

See The F# 3.0 Language Specification (final version, PDF), §8.6.1 Primary Constructors in Classes:

During construction, no member on the type may be called before the last value or function definition in the type has completed; such a call results in an InvalidOperationException.

Almost certainly, your code in the question doesn't tell the full story. If you hit the above mentioned restriction, then there's somewhere an attempt to access a field or member not fully initialized.

Some example:

type X() as this =
    let x = this.X
    member __.X = 42
X()

One workaround might be to encapsulate the offending code in a member of its own and call that in the constructor instead. Another would be the wrapping in a function definition.

like image 113
kaefer Avatar answered Jan 01 '23 08:01

kaefer