2016-06-14 99 views
5

此代码的工作:为什么使这个getter为空可导致编译错误?

class Example 
{ 
    public Int32 Int32 
    { 
     get { return Int32.Parse("3"); } 
    } 
} 

此代码不能编译: '诠释'

class Example 
{ 
    public Int32? Int32 
    { 
     get { return Int32.Parse("3"); } 
    } 
} 

CS1061不包含'Parse'的定义,也没有包含接受'int?'类型的第一个参数的扩展方法'Parse'。可以找到(是否缺少using指令或程序集引用?)


我的例子可以看傻了,但它使许多更有意义,如果你用想象一个枚举,像

public Choice? Choice { get { return Choice.One; } } 
+3

在第二个例子中'Int32'指属性'Int32'不是输入'System.Int32'。 – PetSerAl

回答

5

有属性类型名称是相同的属性名称是涉及的特殊情况下,规格:

7.6.4.1相同的简单名称和类型名称
在形式E.I的成员访问,如果是E单个标识符,并且如果作为简单名称E的含义(第7.6.2节)是常数,字段,属性,局部变量或与E的含义相同类型的参数作为类型名称(§3.8),则允许使用E这两种可能的含义。 E.I这两种可能的含义绝不含糊,因为在两种情况下I都必须是E类型的成员。换句话说,该规则只允许访问静态成员和嵌套类型的E,否则会发生编译时错误。

所以,在你的第一个片段简单的名称Int32允许指财产Int32以及输入Int32

在该规则未应用的第二个片段中,简单名称Int32仅引用属性。

+0

我仍然不清楚为什么在第一种情况下,它不是指财产,但在第二种情况下是这样。 – ehh

+1

@ehh想想如果返回类型是'object'而不是'Int32'。那么“Int32”就会明确指出属性而不是类型。可空类型稍微更微妙,但它仍然是一种不同的类型,所以特殊情况不适用。 –

+0

很好的回答!至少现在对我来说一切都很清楚 – Mafii

7

在第二个示例中,Int32指的是属性Int32而不是System.Int32。由于属性Int32的类型为System.Nullable(System.Int32),因此它没有解析方法。

你必须写,

public Int32? Int32 
{ 
    get { return System.Int32.Parse("3"); } 
} 
+1

我不认为这解释了为什么它不能为空时它工作... –

+1

当它不可为空时,Int32属性的类型为'System.Int32',它有一个解析方法。 –

+1

@ default.kramer将属性类型名称与属性名称相同是规范中涵盖的特例。在这种情况下'Int32'指的是属性,并在同一时间输入。 – PetSerAl