为什么使这个getter可以为空导致编译错误?

时间:2016-06-14 20:14:51

标签: c# c#-6.0

此代码有效:

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

此代码无法编译:

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

CS1061'int?'不包含'Parse'的定义,也没有扩展方法'Parse'接受'int?'类型的第一个参数可以找到(你错过了使用指令或程序集引用吗?)

我的例子可能看起来很傻,但是如果你使用想象一个枚举就更有意义,比如

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

2 个答案:

答案 0 :(得分:7)

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

你必须写,

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

答案 1 :(得分:5)

具有与属性名称相同的属性类型名称是特殊情况,包括规范:

  

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

因此,在您的第一个代码段中,简单名称Int32可以引用属性Int32以及键入Int32

在第二个代码段中未应用该规则,简单名称Int32仅指属性。