2016-06-14 110 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

相關問題