如果string是.net框架中String的别名,为什么会发生这种情况,我应该如何解释它:
type JustAString = string
> type JustAString = string
type JustAStringAgain = String
> type JustAStringAgain = | String
Run Code Online (Sandbox Code Playgroud)
现有的答案是正确的,因为它string是一个F#类型而String不是一个类型(除非你打开System命名空间),这就是两个定义不同的原因.第一种情况创建一个类型别名,而第二种情况声明一个有区别的联合(而不是现有答案中建议的模块别名).
在第一种情况下,定义只创建一个类型别名.我们可以使用typeof<T>以下方式检查
> type MyString = string;;
> typeof<MyString>.FullName;;
val it : string = "System.String"
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,您正在定义一个具有单个案例命名的区别联合String(名称可能是任何东西 - 关键String是不是已知类型,因此它被视为案例的名称).要检查这一点,我们可以使用GetUnionCasesF#反射模块:
> type MyString = String;;
type MyString = | String
> open Microsoft.FSharp.Reflection
for u in FSharpType.GetUnionCases(typeof<MyString>) do
printfn "%s" u.Name;;
String
val it : unit = ()
Run Code Online (Sandbox Code Playgroud)
这个定义只是歧视联盟的一个非常基本的例子.我们可以添加更多案例,案例也可以包含字段:
type MyString = String | SomeOtherName of int
Run Code Online (Sandbox Code Playgroud)
诀窍是,这String不是一个已知的类型名称.如果打开System命名空间,则会再次获得一个类型别名:
> open System;;
> type MyString = String;;
> typeof<MyString>.FullName;;
val it : string = "System.String"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |