Welcome

首页 / 软件开发 / C# / C# 2.0的Specification(匿名方法)(二)

C# 2.0的Specification(匿名方法)(二)2007-11-0421.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的明确赋值状态没有效果。