此代码有效:
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; } }
答案 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)的含义相同,那么两种可能的含义都是允许E
。E.I
的两个可能含义从不含糊,因为I
必须在两种情况下都必须是E
类型的成员。换句话说,该规则只允许访问静态成员和E
的嵌套类型,否则会发生编译时错误。
因此,在您的第一个代码段中,简单名称Int32
可以引用属性Int32
以及键入Int32
。
在第二个代码段中未应用该规则,简单名称Int32
仅指属性。