如何使用编译器推断静态成员的类型?

Sco*_*rod 1 f#

如何使用编译器推断静态成员的类型?

在C#6.0中,编译器可以通过提供"using static <namespace>.<class>"指令来推断静态属性或方法的类型.

因此,我想尽可能少编写代码.

我有以下静态成员:

module Mock

type Profile() =

    static member SomeUserName = "some_user_name"
    static member SomePassword = "some_password"
Run Code Online (Sandbox Code Playgroud)

然后我定义了一些类型和函数:

open Mock

(*Types*)
type User =        User of string
type Password =    Password of string
type Credentials = { User:User; Password:Password }

(*Functions*)
let login credentials =
    false
Run Code Online (Sandbox Code Playgroud)

然后我进行了以下测试:

[<Test>]
let ``sign in`` () =

    // Setup
    let credentials = { User=     User     Profile.SomeUserName
                        Password= Password Profile.SomePassword } 
    // Test
    credentials |> login 
                |> should equal true
Run Code Online (Sandbox Code Playgroud)

我想从SomeUserName和SomePassword中删除配置文件类型限定符,而是执行此操作:

// Setup
let credentials = { User=     User     SomeUserName
                    Password= Password SomePassword } 
Run Code Online (Sandbox Code Playgroud)

我是否必须明确指定静态成员的类型?

The*_*ght 5

正如Fyodor Soikin指出的那样,明显的解决方案就是简单地制作Profile一个模块.

module Profile =
    let someUserName = "some_user_name"
    let somePassword = "some_password"
Run Code Online (Sandbox Code Playgroud)

然后你可以:

open Profile

let credentials = { 
    User = User someUserName;
    Password = Password somePassword 
    }
Run Code Online (Sandbox Code Playgroud)

顺便提一下,虽然目前可能无法在F#中打开静态类,但在未来的版本中看起来会发生变化 - 此功能已经"原则上批准".有关详细信息,请参阅用户语音项.