1. 程式人生 > >3.C#2.0之匿名方法(未完成)

3.C#2.0之匿名方法(未完成)

  3.1匿名方法表示式

     匿名方法表示式是具有特定轉換規則的值,它定義了匿名方法,並得到引用該方法的一個具體值,這個值沒有型別,但它可以被隱式轉換到與之相容的委託型別;匿名方法表示式為引數、區域性變數、常數定義了一個新的宣告空間,並且為標籤定義了一個新的宣告空間。

  3.2匿名方法簽名

     可選的匿名方法簽名,為該匿名方法定義了正式引數的名稱和型別,引數的作用域就是匿名方法的塊;如果引數的名稱,與作用域包含這個匿名方法表示式的區域性變數、區域性常量或引數的名稱匹配,那麼會產生一個編譯時錯誤。

     如果一個匿名方法表示式具有簽名,那麼與之相容的委託型別集合將被限制為那些具有相同順序、相同引數型別、相同修飾符的委託型別集合;如果沒有,那麼與之相容的委託被限制為那些沒有out引數的委託型別集合。

     注:匿名方法簽名不能包含特性或引數陣列;但匿名方法簽名可以和其引數列表包含引數陣列的委託型別相容。

  3.3匿名方法轉化

     匿名方法表示式是一個無型別,可用於委託建立表示式,至於其他所有合法的使用取決於在此定義的隱式轉化:匿名方法表示式與任何與之相容的委託型別之間都存在隱式轉化,如果D是一個委託型別,A是一個匿名方法表示式。如果滿足下面條件,那麼D就與A相容:

          -首先,D的引數型別與A相容:

                -如果A不包含匿名方法簽名,那麼D可以有任意型別的引數,前提是D的引數沒有任何out引數修飾符;

                -如果A具有匿名方簽名,那麼D必須具有相同數量、型別的引數,且A上的每個引數的ref/out修飾符也必須相對應;D的最後一個引數是否是引數陣列,和D與A的相容性無關;

          -其次,D的返回型別必須與A相容,這些規則,不考慮A包含任何其他匿名方法塊的情況:

                -如果D是void,那麼包含在A中的任何返回語句都不應該指定表示式;

                -如果是R型別返回型別,那麼包含在A中的任何返回語句都必須指定一個可以隱式轉換到R的表示式,且A的塊的結束點必須是不可到達的。

     除了從匿名方法到與之相容的委託型別的隱式轉換之外,匿名方法不存在任何其他轉換,即便是對於object型別也是一樣。

     委託建立表示式可用做匿名方法轉換到一個委託型別的替代語言,如果用做委託建立表示式的實參的表示式是一個匿名方法表示式,那麼匿名方法將使用上面定義的隱式轉化規則轉換到給定的委託型別。如果D是一個委託型別:

  3.4匿名方法塊

     匿名方法表示式的塊遵循下列規則:

          -如果匿名方法包含標籤,那麼標籤中的引數在塊中是有效的;如果沒有標籤,它可以被轉換為具有引數的委託型別,但引數不能訪問塊內;

          -除了在最接近封閉匿名方法簽名中指定ref和out引數以外,對於塊來說,訪問ref/out引數將導致編譯時錯誤;

          -當this的型別是一個結構型別時,對於塊來說,訪問this將導致編譯時錯誤。無論訪問時顯式的還是隱式的都如此。該規則只是禁止此類訪問方式,並不影響在結構中成員查詢的結果;

          -塊可以訪問匿名方法的外部變數。當匿名方法表示式被求值的時候,對於外部變數的訪問,將會引用活動的變數的例項;

          -對於塊來說,包含一個其目標在塊之外,或一個內嵌的匿名方法的塊之內的goto、break、continue語句,都會導致編譯時錯誤;

          -在塊內的return語句,將從最接近的封閉匿名方法呼叫中返回控制權,而不是從封閉函式成員中返回。在return語句中指定的表示式必須與某個委託型別相容,而最接近的匿名方法表示式將被轉換到該委託型別。

     除了通過匿名方法表示式求值和調和外,執行一個匿名方法的程式塊,並沒有明確地限制。具體來說,就是編譯器可以通過合成一個/多個命名方法/型別來實現匿名方法。任何此類合成的元素的名字,都必須保留在編譯器的使用空間中:名字必須保留兩個連續下劃字元。

  3.5外部變數

     發