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

时间:2016-08-28 14:16:17

标签: f#

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

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

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

我有以下静态成员:

module Mock

type Profile() =

    static member SomeUserName = "some_user_name"
    static member SomePassword = "some_password"

然后我定义了一些类型和功能:

open Mock

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

(*Functions*)
let login credentials =
    false

然后我进行了以下测试:

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

    // Setup
    let credentials = { User=     User     Profile.SomeUserName
                        Password= Password Profile.SomePassword } 
    // Test
    credentials |> login 
                |> should equal true

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

// Setup
let credentials = { User=     User     SomeUserName
                    Password= Password SomePassword } 

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

1 个答案:

答案 0 :(得分:5)

正如Fyodor Soikin指出的那样,显而易见的解决方案就是简单地将Profile作为一个模块。

module Profile =
    let someUserName = "some_user_name"
    let somePassword = "some_password"

然后你可以:

open Profile

let credentials = { 
    User = User someUserName;
    Password = Password somePassword 
    }

顺便说一下,虽然目前可能无法在F#中打开静态类,但在未来的版本中看起来会发生变化 - 此功能已经“原则上批准”。有关详情,请参阅user voice item