2009-11-17 7 views
0

Des idées sur la façon dont je pourrais ajouter une annotation de type pour corriger cette erreur?Annotation de type pour aucune propriété abstraite

Je reçois un rouge squiggly sous Foo.Bar dans getFooBar et le message d'erreur suivant pour cela.

Rechercher sur un objet de type indéterminé sur la base des informations antérieures à ce point de programme. Une annotation de type peut être nécessaire avant ce point de programme pour contraindre le type de l'objet. Cela peut permettre à la recherche d'être résolue.

[<AllowNullLiteralAttribute>] 
type Test(foo : Test, bar : int) = 

    let getFooBar(test : Test) = 
     test.Foo.Bar 

    member this.Foo with get() = foo 
    member this.Bar with get() = bar 

Répondre

2

Vous pouvez aussi annoter le type de la propriété Foo:

type Test(foo, bar : int) = 
    let getFooBar(test : Test) = 
     test.Foo.Bar 
    member this.Foo with get() : Test = foo 
    member this.Bar with get() = bar 
+0

Je vois ce que j'ai fait de mal. Je mets le membre this.Foo avec get() = foo: Test – gradbot

0

J'ai essayé de faire une fonction anonyme et cela fonctionne.

let getFooBar(test : Test) = 
    test.Foo |> fun (x:Test) -> x.Bar 

Y a-t-il un meilleur moyen?

4

Je ne comprends pas pourquoi cela est nécessaire, mais simplement annoter le résultat de Foo semble fonctionner:

[<AllowNullLiteralAttribute>] 
type Test(foo : Test, bar : int) = 
    let getFooBar(test : Test) = 
     (test.Foo : Test).Bar 

    member this.Foo with get() = foo  
    member this.Bar with get() = bar 
+0

type F # s ' système d'inférence fait par le cerveau blessé parfois. La chose amusante est que, dans votre exemple, vous pouvez maintenant supprimer l'annotation de type dans le constructeur et cela fonctionne toujours: tapez Test (foo, bar: int). – cfern

Questions connexes