为什么可以将名称与其返回类型相同的属性?

时间:2009-11-17 01:54:26

标签: c#

在C#中,为什么可以这样做

public Int32 Int32 { get; set; }

但不是这个

public int int { get; set; }

我的问题应该更加清晰,有没有理由为什么返回类型的属性可以与属性具有相同的名称?

7 个答案:

答案 0 :(得分:9)

变量的名称可能与C#中的语言关键字不同。 int是关键字; Int32是一种类型。

请注意,类型和属性名称实际上并不相同;他们完全合格的名字是不同的。一个是System.Int32,另一个是YourClass.Int32

如果您确实想要将您的属性命名为“int”(不要这样做),您可以使用逐字运算符:

public int @int { get; set; }

来自MSDN

  

前缀“@”允许使用   关键字作为标识符,即   在与其他人接口时很有用   编程语言。人物 @   实际上并不是其中的一部分   标识符,所以标识符可能是   在其他语言中看作是正常的   标识符,没有前缀。一个   调用带有@前缀的标识符   逐字标识符。 使用@   标识符的前缀不是   允许使用关键字,但强烈   作为一种风格而气馁。

答案 1 :(得分:8)

  

有没有理由为什么属性的返回类型可以与属性具有相同的名称?

您正在设计一种编程语言。这应该合法吗?

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#规范部分;有一个有趣的解释为什么查找规则是这样的。

答案 2 :(得分:7)

“int”是C#中的保留字。 Int32是声明的类型。您可以拥有一个名为Int32的成员,因为该成员的范围限定在您的类中,而Int32声明的类型具有不同的范围。

答案 3 :(得分:0)

因为int是关键字。您不能拥有与关键字相同的变量或属性名称。

答案 4 :(得分:0)

我认为它是因为小写“int”是编译器识别的基本类型,而Int32是默认库中的类。

但我很可能错了。 :)

答案 5 :(得分:0)

除语言规范外,这与编译器的工作方式有关。大多数编译器使用两遍(大大简化):

  • Lexing:阅读文字,转换为代币
  • 解析:将令牌排列成逻辑嵌套结构

'int'在lexing阶段是已知的,因为它是一个语言关键字,但'Int32'只是一个可以代表类型或属性的名称。

示例:

public Int32 Int32 {get; set;}

转换为:

<public> <identifier "Int32"> <identifier "Int32"> <lbrace> <get> <set> <rbrace>

其中&lt; xxx&gt;是一种象征。

然后解析成:

{declaration attribute<public> type<"Int32"> property<"Int32"> ...}

其中类型集和名称集不冲突。基本上,编译器能够根据语句的结构确定您是引用类型还是名称。

但是当你使用'int'时:

public int int {get; set;}

<public> <type-int> <type-int> <lbrace> <get> <set> <rbrace>

你可以看到这是如何分解的。

答案 6 :(得分:0)

我一直这样做。也许没有明显的类型,如int,但我经常使用这样的属性:

public Expression Expression { get; set; }

它不会给我带来任何问题...... C#对于类型与属性非常聪明,并不像看起来那样令人困惑。很难找到某些东西的变量和类型名称,因此这是一个很好的功能。