21匿名方法21.1.匿名方法表達式
匿名方法表達式(anonymous-method-expression)定義了匿名方法(anonymous method),它將計算為引用該方法的一個具體值。
l primary-no-array-creation-expression(基本非數組創建表達式:)
…
anonymous-method-expression(匿名方法表達式)
l anonymous-method-expression:
delegate anonymous-method-signature opt block(匿名方法表達式: delegate 匿名方法簽名 可選 塊)
l anonymous-method-signature:
( anonymous-method-parameter-list opt )(匿名方法簽名: 匿名方法參數列表 可選)
l anonymous-method-parameter-list:
anonymous-method-parameter
anonymous-method-parameter-list , anonymous-method-parameter(匿名方法參數列表: 匿名方法參數 匿名方法參數列表)
l anonymous-method-parameter:
parameter-modifieropt type identifIEr(匿名方法參數: 參數修飾符 可選 類型 標識符)
匿名方法表達式被歸類為具有特定轉換規則(§21.3)的值。
匿名方法表達式為參數、局部變量和常數定義了一個新的聲明空間,並且為標簽(§3.3)定義了一個新的聲明空間。
21.2匿名方法簽名
可選的匿名方法簽名(anonymous-method-signature)為該匿名方法定義了正式參數的名字和類型。匿名方法的參數作用域為塊(block)。匹配其作用域包含匿名方法表達式(anonymous-method-expression)的局部變量、局部常數或參數的名字,對於匿名方法參數的名字來說是一個編譯時錯誤。
如果一個匿名方法表達式具有匿名方法簽名,那麼與之兼容的委托類型將被限制為那些具有相同順序(§21.3)相同參數類型和修飾符的委托類型集合。如果匿名方法表達式不具有匿名方法簽名,那麼與之兼容的委托類型將被限制為那些沒有輸出參數的委托類型集合。
請注意,匿名方法簽名不能包含特性或者參數數組。不過,匿名方法簽名可以與其參數列表包含參數數組的委托類型兼容。
21.3匿名方法轉換
匿名方法表達式被歸類為一個無類型的值。匿名方法表達式可以用於委托創建表達式(§21.3.1)中。匿名方法表達式的所有其他合法的使用取決於在此定義的隱式轉換。
隱式轉換存在來自於與任何委托兼容的匿名方法表達式。如果D是一個委托類型,而A是一個匿名方法表達式,那麼如果下面的條件滿足的話,D就與A兼容:
l 首先,D的參數類型與A兼容:
n 如果A不包含匿名方法簽名,那麼D可以有零或多個任意類型的參數,前提是D沒有任何參數具有輸出參數修飾符。
n 如果A具有匿名方法簽名,那麼D必須具有相同數量的參數,A的每個參數與D的對應參數必須具有相同的類型,並且在A上的每個參數的ref或out修飾符的存在與否,都必須與D的對應參數相匹配。D的最後一個參數是否是參數數組和D與A的兼容性無關。
l 其次,D的返回類型必須與A兼容,對於這些規則,不考慮A包含任何其他匿名方法塊的情況。
n 如果D采用void聲明返回類型,那麼包含在A中的任何返回語句都不應該指定表達式。
n 如果D采用類型R聲明返回類型,那麼那麼包含在A中的任何返回語句的都必須指定一個可以隱式轉換(§6.1)到R的表達式。並且,A的塊的結束點必須是不可達的。