2014-11-20 37 views
1

我想使用具有約束的泛型來允許訪問參數的屬性。在函數內部訪問屬性會產生一個編譯時警告:「這個構造會導致代碼的泛型低於類型註釋所指示的類型變量'Item被限制爲'Foo2'類型。約束產生「此構造會導致代碼不那麼通用...」

namespace Test 
type Foo = { Bar:string; NotUsed:string } 
type Foo2 = { Bar:string } 

module Shared = 
    let inline showMeABar (item: ^Item when ^Item : (member Bar : string)) = item.Bar 

我犯了一個語法錯誤還是這是不可能的?

回答

3

調用getter很奇怪。你可以這樣做明確的是這樣的:

let inline showMeABar item = 
    (^Item : (member Bar : string) item) 

唱片公司有奇怪的(但有用)的屬性,它們與點符號的用法是類型推斷的提示。因此奇怪的錯誤信息。

+2

請注意,您可以將註釋放在'item'上,因爲它現在可以從呼叫站點推斷出來。 – kvb 2014-11-20 20:21:32

+0

@kvb對,謝謝!編輯。 *如果允許縮短它,我正準備嘗試。還在編譯器警告中添加了一個註釋,通常期望不確定類型錯誤* – Vandroiy 2014-11-20 20:26:59

+0

謝謝@Vandroiy。我之前沒有看到過這個成員訪問語法。你碰巧知道使用它的一個很好的參考? – ShawnMartin 2014-11-20 20:29:55

相關問題