为什么可以将名称与其返回类型相同的属性?
在C#中,为什么可以这样做
public Int32 Int32 { get; set; }
但不是这个
public int int { get; set; }
在我的问题中我应该更干净,是否有任何理由为什么返回类型的属性可以与属性具有相同的名称?
变量的名称可能与C#中的语言关键字不同。 int
是一个关键字; Int32
是一种类型。
请注意,类型和属性名称实际上并不相同; 他们完全合格的名字是不同的。 一个是System.Int32
,另一个是YourClass.Int32
。
如果你真的想要将你的属性命名为“int”(不要这样做),你可以使用verbatim运算符:
public int @int { get; set; }
来自MSDN :
前缀“@”允许使用关键字作为标识符,这在与其他编程语言交互时很有用。 字符@实际上不是标识符的一部分,因此标识符可能在其他语言中看作普通标识符,没有前缀。 带有@前缀的标识符称为逐字标识符。 允许使用@前缀作为非关键字的标识符,但强烈建议不要使用样式。
有没有理由为什么属性的返回类型可以与属性具有相同的名称?
您正在设计一种编程语言。 这应该合法吗?
enum Color { Red, Blue, Mauve } class Rectangle { ... public Color Color { get; set; } }
你有两个选择。 (1)使其成为非法。 要求执行此操作的任何人为类型和属性提供不同的名称。 也许您会提供一些关于类型或属性的好名称不是“颜色”的建议。 (2)使其合法化。
我们没有兴趣将选项(1)的负担强加给您。
允许属性及其类型具有相同的名称会在名称解析中引入一些有趣的歧义,我们将其称为“颜色问题”。 有关这方面的一些想法,请参阅我关于它的一个方面的文章:
http://blogs.msdn.com/ericlippert/archive/2009/07/06/color-color.aspx
或者,阅读关于颜色问题的C#规范部分; 有一个有趣的解释为什么查找规则是这样的。
“int”是C#中的保留字。 Int32是声明的类型。 您可以拥有一个名为Int32的成员,因为该成员的范围限定在您的类中,而Int32声明的类型具有不同的范围。
因为int
是一个关键字。 您不能拥有与关键字相同的变量或属性名称。
我假设它是因为小写“int”是编译器识别的基本类型,而Int32是默认库中的类。
我很可能错了。 🙂
除语言规范外,这与编译器的工作方式有关。 大多数编译器使用两次传递(大大简化):
- Lexing:阅读文本,转换为令牌
- 解析:将令牌排列成逻辑嵌套结构
‘int’在lexing阶段是已知的,因为它是一个语言关键字,但’Int32’只是一个可以代表类型或属性的名称。
例:
public Int32 Int32 {get; set;}
被转换成类似的东西:
其中
然后解析成:
{declaration attribute type<"Int32"> property<"Int32"> ...}
其中类型集和名称集不冲突。 基本上,编译器能够根据语句的结构确定您是引用类型还是名称。
但是当你使用’int’时:
public int int {get; set;}
成
你可以看到这是如何分解的。
我一直这样做。 也许没有明显的类型,如int,但我经常使用这样的属性:
public Expression Expression { get; set; }
它不会给我带来任何问题…… C#对于类型与属性非常聪明,并不像看起来那样令人困惑。 很难找到某些东西的变量和类型名称,因此它是一个很好的function。