C#int,Int32和枚举
如果int
与Int32
同义,为什么呢
enum MyEnum : Int32 { Value = 1 }
…不编译? 在哪里
enum MyEnum : int { Value = 1 }
会,即使鼠标hover在整数字将显示结构System.Int32?
基础types确实是相同的,但编译器依赖于types作为确切的别名。 这是基于parsing的编译错误。 我看了一下C#语法规范以及基于别名定义的基础types(例如'int','unit'…等等)。 parsing器需要整型语法规则中的特定string。
即使两个enum Enum : int
意味着相同enum Enum : Int32
错误是一个parsing错误 。
我不知道强制这个限制parsing步骤的原因,但我可以尝试猜测:因为Int32不是一个关键字,它可能会引用其他实际的结构。 如果parsing器必须知道types以便为每个基types构build不同的AST ,那么它不能依赖于不是关键字的令牌。
即使C#规范将int关键字定义为显式别名System.Int32 ,但在parsing步骤中获取关于显式types(Int32)的这些信息仍然是个问题,因为它需要大量无法在此步骤推断的上下文信息。
熟悉的好奇心…语言规范(14.1):
枚举声明可以显式声明一个基本types的字节,sbyte,short,ushort,int,uint,long或ulong。 请注意,char不能用作基础types。 没有明确声明基础types的枚举声明的基础types为int。
但是因为int
通常只是System.Int32
一个别名,所以认为两者都可以工作并不是不合理的 ,但事实并非如此。 这通常不是一个大问题,但毫不困难。
- 卡在C#中洗牌
- 无法使用visual studio 2013debugging托pipe代码(“无法评估expression式”错误 – 我正在使用debugging版本)(请注意VS 2012的工作原理)
- Clipboard.GetText返回null(空string)
- 如何将Unicode转义序列转换为.NETstring中的Unicode字符?
- unit testing一个asp.net应用程序时如何使用web.config
- 如何通过.NET / C#中的reflection来提高事件?
- 使用C#上传文件到FTP
- 为什么许多语言端口的.net前缀为“铁”?
- 如何取消selectDataGridView控件中的所有选定的行?