Ste*_*e B 27 c# compiler-errors
如果我宣布这样的枚举......
public enum MyEnum : byte {
Val1,
Val2
}
Run Code Online (Sandbox Code Playgroud)
......它正在发挥作用.
如果我宣布这样的枚举......
public enum MyEnum : System.Byte {
Val1,
Val2
}
Run Code Online (Sandbox Code Playgroud)
......它不起作用.编译抛出:
错误CS1008:键入byte,sbyte,short,ushort,int,uint,long或ulong expected
由于byte是实际类型的别名System.Byte,为什么我不能使用第二个声明?
Eri*_*ert 29
这里提出了一些问题.
为什么我不能声明继承自Byte的枚举但我可以从byte?
正如其他人所指出的那样,这就是规范所说的.
语言设计委员会注意到这一决定并不合理.2000年6月的笔记说
预定义类型(例如,int)的关键字及其对应的类型名称(例如,Int32)可以大部分但不完全可互换地使用.我们讨论过是否要在这方面做出任何改变.我们没有.
以下是不可互换的地方列表.
- "int"可以用作枚举的基础类型; Int32不能.
- 别名声明不能使用关键字.
关于这个问题我的一些想法:
首先想到的是,每次你给用户一个选择时,你给他们一个写bug的机会,每当你给他们一个写bug的机会时你就必须为它做一个错误信息.如果我们允许"枚举X:字节",那么当用户意外删除"使用系统"时,我们会给出合理的错误消息.我们能够避免潜在的混乱和发展,通过简单地不允许在第一时间选择测试一个错误报告启发式的所有费用.
我想到的第二件事情是,基础类型的枚举的基本上是关于该机构的枚举,而不是它的意义.因此,似乎有理由认为,基础类型条款应限于不需要语义分析的事物; 我们知道底层类型是八种可能的类型之一,所以让我们让用户机械地从这八种类型中的一种中明确地选择.
我想到的第三件事是错误分析可以在句法分析过程中进行,而不是语义分析.错误越早发现越好.
更新:那天我刚刚问了一个在房间里的人是否在我的思考中遗漏了什么,他说是的,他们想到了这一点并决定进行全类型分析是为了开发工作,测试和维护团队,购买用户没有任何价值的工作.(他还注意到他们在System.Void上有类似的论点;例如,说"public static System.Void Main(string [] args)"是否合法?再次,他们认为这对用户没有增加任何价值但是增加潜在的模糊性并为团队工作.)
为什么"char"不是合法的基础类型?
再一次,这就是规范所说的.同样,1999年10月的语言设计说明无助于确定原因:
无符号整数类型可以用作枚举的基础类型.唯一不能使用的整数类型是char.
我们再一次猜测.我的猜测是,enums旨在成为花哨的数字.Chars实际上是整数作为实现细节,但从逻辑上讲它们不是数字,而是字符.我们希望能够对枚举进行操作,如添加,"或"和"和"标志等等; 规范很清楚,这些操作就像在基础类型上完成一样.char类型(逻辑上不是数字)不会定义您可能需要的所有运算符.最后,如果你想要一个两字节的枚举值,那么你已经拥有了short和ushort.
有关此问题的电子邮件中的相关问题:
仔细阅读语法规范说'char'在语法上是一种合法的基础类型,但语法后的解释性文本段落说'char'不是合法的基础类型.规格是否不一致?
是.我不会因此失眠.如果它让你感觉更好,想象一下语法行
枚举:整数型
而是阅读
枚举:整数型(但不是char)
jas*_*son 26
嗯,这是根据规范(§14.1).语法指定生产enum-declaration是
enum-declaration:
attributes_opt enum-modifiers_opt enum identifier enum-base_opt enum-body ;_opt
Run Code Online (Sandbox Code Playgroud)
哪里
enum-base 是
:integral-type
Run Code Online (Sandbox Code Playgroud)
和
integral-type:
sbyte
byte
short
ushort
int
uint
long
ulong
char
Run Code Online (Sandbox Code Playgroud)
至于规范是这样的原因,目前尚不清楚.
请注意,它char被列为终端,integral-type但规范明确说明了这一点
请注意,
char不能用作基础类型.
顺便说一句,我认为这里的最佳实践是使用别名.string当我想调用静态方法时,我只使用.NET名称而不是C#关键字来表示这些原始类型(和).所以
Int32.TryParse
Run Code Online (Sandbox Code Playgroud)
代替
int.TryParse.
Run Code Online (Sandbox Code Playgroud)
否则,我说,例如,typeof(int)而不是typeof(Int32).
Jon*_*eet 10
最简单的答案是"这就是它指定的方式." (这是在C#4规范的第14.1节中.其他版本的编号可能会有所不同.)
规范没有给出这个1的任何特定原因,但是可以说更容易描述整数类型别名(它们都是关键字),而不是说它可以是任何解析(通过其他类型别名,如using指令)的类型一个特定的集合之一.
你有什么理由想要使用System.Byte吗?
1带注释的C#4规范在本节中确实有一个注释......但它是由我编写的,并且只是指出这是规范中为数不多的几个你不能用普通类型替换别名的地方之一名.所以对这个问题不是很有帮助:)
| 归档时间: |
|
| 查看次数: |
4481 次 |
| 最近记录: |