[英]Generic modules in F#
在C#中,我可以編譯
static class Foo<T> { /* static members that use T */ }
結果是通用的,不可實例化。
什么是等效的F#代碼? module<'a>
不編譯, type Foo<'a>
是可實例化的。
到目前為止,其他答案都有部分圖片......
type Foo<'a> private() = // '
static member Blah (a:'a) = // '
printfn "%A" a
是很棒的。 忽略Reflector生成的內容,你不能在F#程序集中實例化這個類(因為構造函數是私有的),所以這很好用。
F#也允許使用靜態構造函數,語法是在類中包含'static let'和'static do'語句(類似於'let'和'do'如何作為實例的主構造函數體的一部分工作) 。 一個完整的例子:
type Foo<'a> private() = // '
static let x = 0
static do printfn "Static constructor: %d" x
static member Blah (a:'a) = // '
printfn "%A" a
//let r = new Foo<int>() // illegal
printfn "Here we go!"
Foo<int>.Blah 42
Foo<string>.Blah "hi"
我一開始以為這會接近你想要的東西:
type Foo<'a> private() =
static member Blah (a:'a) =
printfn "%A" a
就像只能通過反射或類本身(希望不會這樣做)實例化的成語前c#2.0。
但是這被編譯為:
[Serializable, CompilationMapping(SourceConstructFlags.ObjectType)]
public class Foo<a>
{
internal Foo() {...}
public static void Blah(a a) {...}
}
這意味着f#程序集中的其他類可以實例化它。
然而,知情的Brian已經指出f#編譯器尊重這個私有設置,盡管底層的CLR類型意味着實例化的唯一方法是通過反射或使用類似InternalsVisibleTo屬性的東西。
這可能仍然可以滿足您的需求......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.