2017-05-24 55 views
2

我得到的ToBar爲什麼這個代碼不夠通用甚至更好爲什麼甚至檢查?

type Foo = {foo: string} 
type Bar = {bar: string} 

[<AbstractClass>] 
type AbstractType< ^T> (fn: ^T -> Foo) = 

    member inline this.ToFoo (x: ^T) = fn x 
    abstract ToBar: string -> Bar 

這定義的錯誤是錯誤消息

This code is not sufficiently generic. 
The type variable ^T could not be generalized 
because it would escape its scope. 
從事實

除了那個(甚至是閱讀所有其他等等這個問題之後)我不知道得到什麼這個錯誤試圖告訴我...但它是完全驚人的ToBar甚至不使用該類型的參數正在出現錯誤

回答

4

這是因爲ToBar不是inline,這是使用靜態解析類型約束的必要條件。但似乎你並不真的需要它們,簡單的泛型就足夠了。所以只是'T取代^T,這將很好地工作:

[<AbstractClass>] 
type AbstractType<'T> (fn: 'T -> Foo) = 

    member inline this.ToFoo (x: 'T) = fn x 
    abstract ToBar: string -> Bar 

如果你想多一點,它纔有意義:一個abstract成員不能很好的運用SRTC的,因爲它是在派遣運行時和SRTC類型需要在編譯時知道。

與此相關的,即使你在努力保持SRTC擺脫ToBar,你會打一個錯誤:

error FS1113: The value 'ToFoo' was marked inline but its implementation makes use of an internal or private function which is not sufficiently accessible 

這可以通過類型本身的私人固定:

type private AbstractType< ^T> (fn: ^T -> Foo) = 
    member inline this.ToFoo (x: ^T) = fn x 

這將起作用,因爲該類型不能從外部程序集訪問,因此不需要公開其SRTC參數。

相關問題