繁体   English   中英

F#中的通用模块

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM