string vs String - å•ä¾‹åŒºåˆ†è”åˆ

时间:2014-03-17 15:00:08

标签: .net string f#

If string is an alias of String in the .net framework为什么会å‘生这ç§æƒ…况,我应该如何解释它:

type JustAString = string
> type JustAString = string

type JustAStringAgain = String 
> type JustAStringAgain = | String

1 个答案:

答案 0 :(得分: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 = ()

这个定义åªæ˜¯æ­§è§†è”盟的一个éžå¸¸åŸºæœ¬çš„例å­ã€‚我们å¯ä»¥æ·»åŠ æ›´å¤šæ¡ˆä¾‹ï¼Œæ¡ˆä¾‹ä¹Ÿå¯ä»¥åŒ…å«å­—段:

type MyString = String | SomeOtherName of int

诀çªæ˜¯Stringä¸æ˜¯å·²çŸ¥çš„类型å称。如果打开System命å空间,则会å†æ¬¡èŽ·å¾—一个类型别å:

> open System;;
> type MyString = String;;

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