有什麼辦法從靜態成員訪問允許綁定的字段?下面給出指示錯誤:從靜態成員訪問允許綁定的字段
type Foo(x) =
let x = x
static member test() =
let foo = Foo(System.DateTime.Now.Month)
printfn "%A" foo.x //the field, constructor or member 'x' is not defined
()
而私人明確的領域都允許從靜態成員訪問:
type Bar =
val private x:int
new(x) = { x=x }
static member test() =
let Bar = Bar(System.DateTime.Now.Month)
printfn "%A" Bar.x
()
文檔http://msdn.microsoft.com/en-us/library/dd469494.aspx規定「明確字段不用於常規使用」,但訪問來自靜態成員的私有實例字段當然是一個常規場景。此外,我不相信你可以在主構造器中設置顯式字段,這意味着即使一個私有實例字段需要從靜態成員中訪問,所有的字段都必須移動到顯式字段,並且不能再使用主構造函數 - 全部或全部。
作爲真正的世界示例,您實際上想要從靜態成員訪問私有實例字段,請考慮一個大整數實現:BigInteger類將是不可變的,因此大整數的內部表示形式將保留爲私有實例字段(我們稱之爲data
)。現在,假設您認爲Add(other)
實例方法不適用於不可變的數據結構,並且您只想實現一個靜態的Add(lhs,rhs)
方法:在這種情況下,您需要能夠訪問lhs.data
和rhs.data
。
是否有任何技術或邏輯的原因,爲什麼讓綁定字段在這方面明確的私人領域應該有任何不同的行爲? – 2010-06-23 04:50:33
@Stephen - 請參閱我的最新推測,瞭解爲什麼可能採取了這種方法。 – kvb 2010-06-23 05:27:57
謝謝。他們在詞彙範圍的事實是否限制了編譯器發現它們作爲這些場景中的字段的能力(是否「隱含私有」=隱藏)? – 2010-06-23 12:50:26