字符串(string)与String——单个大小写区分联合体

6
如果string在.NET框架中是String的别名,那么为什么会发生这种情况,我应该如何解释它:
type JustAString = string
> type JustAString = string

type JustAStringAgain = String 
> type JustAStringAgain = | String
1个回答

9
现有答案正确,因为string是F#类型,而String不是类型(除非您打开System名称空间),这就是两个定义不同的原因。第一种情况创建了一个类型别名,而第二种情况声明了一个辨识联合(而不是现有答案中建议的模块别名)。
在第一种情况下,该定义仅创建了一个类型别名。我们可以使用typeof<T>检查这一点:
> type MyString = string;;

> typeof<MyString>.FullName;;
val it : string = "System.String"

在第二种情况下,您正在定义一个具有单个命名为String的区分联合(名称可以是任何内容 - 关键是String不是已知类型,因此它被视为案例名称)。要检查这一点,我们可以使用F#反射模块中的GetUnionCases函数:
> 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 = ()

定义只是一个非常基本的discriminated union情况。我们可以添加更多的情况,这些情况也可以包含字段:
type MyString = String | SomeOtherName of int

窍门在于String不是一个已知的类型名称。如果打开System命名空间,那么你将再次得到一个类型别名:
> open System;;
> type MyString = String;;

> typeof<MyString>.FullName;;
val it : string = "System.String"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接