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

def*_*mer 5 c# c#-6.0

此代码有效:

class Example
{
    public Int32 Int32
    {
        get { return Int32.Parse("3"); }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码无法编译:

class Example
{
    public Int32? Int32
    {
        get { return Int32.Parse("3"); }
    }
}
Run Code Online (Sandbox Code Playgroud)

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


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

public Choice? Choice { get { return Choice.One; } }
Run Code Online (Sandbox Code Playgroud)

Jon*_*len 7

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

你必须写,

public Int32? Int32
{
    get { return System.Int32.Parse("3"); }
}
Run Code Online (Sandbox Code Playgroud)

  • @ default.kramer*7.6.4.1相同的简单名称和类型名称*. (3认同)

use*_*407 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仅指属性.