2012-02-27 41 views
1
public class Outer 
{ 
    public class Inner 
    { 
     public static string OtherValue { get { return SomeValue; } } 
    } 

    public static string SomeValue { get { return "Outer"; } } 
} 

爲什麼上面編譯? Inner中的某些值是否超出範圍並需要使用Outer.SomeValue進行排位?是不是上面的基本相同(不會編譯)?這個內部類靜態範圍的魔法是如何工作的?

public class Outer 
{ 
    public class Inner 
    { 
     public static string OtherValue { get { return Outer.SomeValue; } } 
    } 

    public static string SomeValue { get { return "Outer"; } } 
} 

什麼static魔術在這裏?

+1

對於你命名一個嵌套類是非常困惑的,它是**不是**子類「sub」,而外部類是**不是**超類「超級」! – 2012-02-27 15:57:10

+0

好點,從另一個問題切割/粘貼,對不起。 – gingerbreadboy 2012-02-27 16:53:14

+0

感謝您的修改:) – gingerbreadboy 2012-03-02 11:34:03

回答

1

內部類繼承外部類作用域的一部分。因此Outer中的成員可以在Sub之內訪問,但它們仍屬於外部類,這就是爲什麼Sub.SomeValue不起作用。

的技術術語是詞法作用域,它意味着一個變量的範圍涵蓋了「詞彙」塊它是在,即,它是內中定義它的源代碼塊,包括子的任何地方可訪問不管運行時間所有權如何,另見:https://en.wikipedia.org/wiki/Scope_%28programming%29#Lexical_scoping

語言如Javascript,Lisp,Haskell和大多數其他語言旨在功能編程廣泛使用詞法範圍,它與其他FP概念密切相關,如部分函數應用程序,閉包和currying。

一旦你習慣了它,它可以是一個令人難以置信的有用(和優雅)的工具。

+0

現在全部回到我身上:) – gingerbreadboy 2012-02-27 14:53:33

7

它是這樣的:

public class Super 
{ 
    public class Sub 
    { 
     public static string OtherValue { get { return Super.SomeValue; } } 
    } 

    public static string SomeValue { get { return "Outer"; } } 
} 

隨着Super保持靜態SomeValue


更清楚地顯示,如:

public class Super 
{ 
    public static string SomeValue { get { return "Outer"; } } 
} 

public class Sub 
{ 
    public static string OtherValue { get { return Super.SomeValue; } } 
} 
Sub

現在和Superpublic它們的靜態屬性是visib在他們共同的範圍內。正如@jonskeet指出的那樣,編譯器會首先搜索SomeValue,因爲在該類中使用了該值,所以首先查找類Sub

現在這樣的事情不會編譯:

public class Super 
{ 
    private static string SomeValue { get { return "Outer"; } } 
} 

public class Sub 
{ 
    public static string OtherValue { get { return SomeValue; } } 
} 

然而,

public class Super 
{ 
    private static string SomeValue { get { return "Outer"; } } 

    public class Sub 
    { 
     public static string OtherValue { get { return SomeValue; } } 
    } 
} 

上面是好的,由於類的嵌套。

+0

問題是爲什麼這項工作,什麼是原因。 – gingerbreadboy 2012-02-27 14:49:38

+0

@gingerbreadboy,我以爲我的代碼會解釋不同之處。但是,我會更新以更好地解釋。謝謝你指出。 – Joe 2012-02-27 14:51:49

2

Sub是Super的嵌套類,所以Super的任何成員都在Sub的範圍內。但是,這些「繼承」成員不是Sub的成員,因此Sub.SomeValue無效。編譯器將SomeValue轉換爲Super.SomeValue

2

它與簡單名稱的含義,它是由C#4規範的7.6.2節規定的事:

否則,對於每個實例類型T(10.3.1節),開始與實例類型立即封閉類型聲明的和與該實例類型的每個封閉類或結構聲明的(如果有的話)繼續:

  • ...
  • 否則,如果一個成員查找(第7.4節)我在T搭配K型變量產生匹配:
    • [......這裏不適用...]
    • [......這裏不適用...]
    • 否則,結果是與表格T.I [...的成員訪問(7.6.4節)相同[...]

因此,換句話說,編譯器首先檢查是否Sub.SomeValue是有效的,發現它不是,則它檢查Super.SomeValue,並發現它是。