21.7委托實例相等性
如下規則適用由匿名方法委托實例的相等運算符(§7.9.8)和object.Equals方法產生的結果。
l 當委托實例是由具有相同被捕獲外部變量集合的語義相同的匿名方法表達式計算而產生時,可以說(但不是必須)它們相等。
l 當委托實例由具有語義不同的匿名方法表達式,或具有不同的被捕獲外部變量集合時,它們決不相等。
21.8明確賦值
匿名方法參數的明確賦值狀態與命名方法是相同的。也就是,引用參數和值參數被明確的賦初值,而輸出參數不用賦初值。並且,輸出參數在匿名方法正常返回之前必須被明確賦值(§5.1.6)。
當控制轉換到匿名方法表達式的程序塊時,對外部變量v的明確賦值狀態,與在匿名方法表達式之前的v的明確賦值狀態是相同的。也就是,外部變量的明確賦值將從匿名方法表達式上下文被繼承。在匿名方法程序塊內,明確賦值將和在普通程序塊內一樣而得到演繹(§5.3.3)。
在匿名方法表達式之後的變量v的明確賦值狀態與在匿名方法表達式之前它的明確賦值狀態相同。
例如
delegate bool Filter(int i);
void F() {
int max;
// 錯誤,max沒有明確賦值
Filter f = delegate(int n) { return n < max; }
max = 5;
DoWork(f);
}
將產生一個編譯時錯誤,因為max沒有在匿名方法聲明的地方明確賦值。示例
delegate void D();
void F() {
int n;
D d = delegate { n = 1; };
d();
//錯誤,n沒有明確賦值
Console.WriteLine(n);
}
也將產生一個編譯時錯誤,因為匿名方法內n的賦值,對於該匿名方法外部n的明確賦值狀態沒有效果。