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外部变量

     发

猜你喜欢

转载自www.cnblogs.com/dreamoffire/p/10186704.html
今日推荐