Skip to content

error FS0073: internal error: Undefined or unsolved type variable: 'a #147

@KevinRansom

Description

@KevinRansom

opened on CodePlex by marten_range

Evaluating the following in FSI results in an internal error

~vs514B.fsx(35,6): error FS0073: internal error: Undefined or unsolved type variable: 'a

The error marker corresponds to the line type DelayedAdornerUpdater ...

#r "PresentationCore"
#r "PresentationFramework"
#r "System.Xaml"
#r "UIAutomationTypes"
#r "WindowsBase"

open System
open System.Windows
open System.Windows.Documents

let FindAdorner (layer : AdornerLayer) (e : UIElement) : #Adorner =
    if layer <> null then
        let adorners = layer.GetAdorners e
        if adorners <> null then
            let mutable iter    = 0
            let mutable result  = null
            while (not (Object.ReferenceEquals(result, null))) && iter < adorners.Length do
                match adorners.[iter] with
                | :? #Adorner as a -> result <- a
                | _ -> ()
                iter <- iter + 1

            result
        else
            null
    else
        null

let UpdateLoadedAdorner (updater : FrameworkElement*AdornerLayer*#Adorner->unit, fe : FrameworkElement) =
    let layer   = AdornerLayer.GetAdornerLayer fe
    if layer <> null then
        let adorner = FindAdorner layer fe
        updater (fe, layer, adorner)

type DelayedAdornerUpdater(updater : FrameworkElement*AdornerLayer*#Adorner->unit, fe : FrameworkElement) as this =

    let onLoaded sender args =
        fe.Loaded.RemoveHandler this.OnLoaded
        UpdateLoadedAdorner (updater, fe)

    member this.OnLoaded = RoutedEventHandler onLoaded

let UpdateAdorner (updater : FrameworkElement*AdornerLayer*#Adorner->unit) (e : UIElement) : unit =
    match e with 
    | :? FrameworkElement as fe -> 
        if fe.IsLoaded then UpdateLoadedAdorner (updater, fe)
        else
            let updater = DelayedAdornerUpdater (updater, fe)
            fe.Loaded.AddHandler updater.OnLoaded
    | _ -> ()

comments
marten_range wrote Oct 22, 2014 at 12:17 PM [x]
Rewriting DelayedAdornerUpdater to this seems to get the compiler on the right track:
type DelayedAdornerUpdater<'Adorner when 'Adorner :> Adorner and 'Adorner : null>(updater : FrameworkElement_AdornerLayer_'Adorner->unit, fe : FrameworkElement) as this =

    let onLoaded sender args =
        fe.Loaded.RemoveHandler this.OnLoaded
        UpdateLoadedAdorner (updater, fe)

    member this.OnLoaded = RoutedEventHandler onLoaded

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions