2011-04-22 27 views
1

我的第一個想法是:F# - >通用型 - 多不是struct

type ManyNavigationPropertyInfo<'a,'b>(cfg:ManyNavigationPropertyConfiguration<'a, 'b>) = 

但是它解決'a'bobj,但它應該是類 - 所以我所做的:

類型許多導航屬性信息<'a 'a:not struct',b when'b:not struct>(cfg:ManyNavigationPropertyConfiguration <'a, 'b>)=

但只是拋出一個錯誤說在類型名稱

意外的象徵 ''。 預期'>'或其他標記。

聲明這種類型的正確方法是什麼?

UPDATE:

我完整的代碼:

type ManyNavigationPropertyInfo<'a,'b>(cfg:ManyNavigationPropertyConfiguration<'a, 'b>) = 
    member x.WithMany (expr: Expr<'a -> ICollection<'b>>) = 
     cfg.WithMany(ToLinq(expr)) 

,並與2個編譯器錯誤說'a'bnot struct出現。

回答

4

你的第一個想法是正確的。你應該能夠這樣寫:

type ManyNavigationPropertyInfo<'a,'b> 
     (cfg:ManyNavigationPropertyConfiguration<'a, 'b>) = 
    // ... 

這個問題可能是在類型的身體某處後。根據您在本體中編寫的內容,編譯器認爲'a'b必須是obj類型(例如,您正在將此類型的值傳遞到需要obj的地方,或者可能更細微)。

您可以嘗試在類的主體中添加類型註釋 - 這通常有助於查找問題,因爲當您註釋F#編譯器解釋的位置與您預期的位置不同時,錯誤消息會發生更改。

爲了解決你的問題當前的問題 - 語法用於指定約束是一個有點不同(先寫所有類型的變量,然後限制):

type ManyNavigationPropertyInfo<'a, 'b when 'a : not struct and 'b : not struct>(...) 

(但如果你可以張貼較大的部分代碼,也許有人可以給出具體的建議。)

相關問題