2011-12-28 117 views
5

在開發F#應用程序時,我有一個包含類型爲Lazy<'T>的屬性的類型。F#屬性與C#屬性的對比

顯然,一個有趣的副作用(原諒雙關語)的該F#處理性質(而不是在C#方式)的語法糖的方法是一個屬性的獲取和設置可以返回/接受不同類型。 (至少,Visual Studio是不是我寫的代碼,它利用這種觀察的優勢抱怨)

例如,有利的是,我做這件事:

let lazyValue = lazy 0 

member this.Value 
    with get() = 
     lazyValue.Value 
    and set _lazyVal = 
     lazyValue <- _lazyVal 

...這樣的價值返回int,但是接受只有一個Lazy<int>

我想知道的是這樣做的理論,慣用和實際的反對意見。這是F#勢利鼻涕會變成什麼樣子?這個(面向對象的實現)顯然違反了一些函數式編程經驗法則嗎?這是一種已被證明會在大規模應用中導致問題的方法嗎?如果是這樣,爲什麼/如何?

+3

這是允許的,是F#編譯器中的一個錯誤 - F#規範說它是非法的。預計這將不再適用於未來版本的F#。 : - ] – ildjarn

回答

5

也許這是一個錯誤,「Visual Studio不抱怨,因爲[你]編寫利用這個觀察的代碼」。見Using F# Option Type in C#

註釋的答案的鏈接的問題說明:

從規範的節8.13.1:如果一個屬性成員都具有一個getter和一個setter,也不是索引,那麼getter和setter的簽名必須暗示相同的屬性類型