string vs String - 单例区分联合

NoI*_*his 6 .net string f#

如果string是.net框架中String的别名,为什么会发生这种情况,我应该如何解释它:

type JustAString = string
> type JustAString = string

type JustAStringAgain = String 
> type JustAStringAgain = | String
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 9

现有的答案是正确的,因为它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)

  • Mea culpa!我删除了错误的答案. (2认同)