C#中的匿名方法

添加人:iyond七级(4372分)   添加时间:2007-05-18    阅读次数:6857  收藏此教程

匿名方法签名

    可选的匿名方法签名(anonymous-method-signature)为匿名方法的形式参数定义了名字和类型。这些参数的作用于是匿名方法的块(block)。如果一个局部变量的作用域包含了匿名方法表达式(anonymous-method-expression),且该匿名方法的参数和该局部变量相同,则会产生编译错误。

    如果一个匿名方法表达式(anonymous-method-expression)具有匿名方法签名(anonymous-method-signature),则与之兼容的委托类型被强制具有相同的参数类型和修饰符,且具有相同顺序(见3.3)。如果一个匿名方法表达式(anonymous-method-expression)没有匿名方法签名(anonymous-method-signature),则与之相兼容的委托类型被强制要求没有out参数。

    注意匿名方法签名(anonymous-method-signature)不能包含特性或参数数组(译注:用于实现变长参数列表)。然而,一个匿名方法签名(anonymous-method-signature)可以和一个包含参数数组的委托类型相兼容。

匿名方法转换

    匿名方法表达式(anonymous-method-expression)是一个没有类型的特殊值。一个匿名方法表达式(anonymous-method-expression)可以用于委托建立表达式(delegate-creation-expression)(见3.3.1)。对于匿名方法表达式(anonymous-method-expression)的其他有效的应用取决于定义于其上的隐式转换。

    匿名方法表达式(anonymous-method-expressio)与任何兼容的委托类型之间均存在隐式转换。如果D是一个委托类型,而A是一个匿名方法表达式(anonymous-method-expression),当且仅当以下两个条件成立的时候D和A是兼容的。

首先,D的参数类型必须与A兼容:
    如果A不含匿名方法签名(anonymous-method-signature),则D可以具有任意类型的零或多个参数,但这些参数不能带有out修饰符。

    如果具有匿名方法签名(anonymous-method-signature),则D必须具有和A形同数量的参数,A中的每个参数必须和D中相应的参数具有相同的类型,并且A中每个参数上的ref或out修饰符的出现与否必须与D中的相应参数相同。如果D中的最后一个参数是参数数组,则没有相互兼容的A和D。

其次,D的返回值类型必须与A兼容。由于这一规则,A中不能包含其他匿名方法的块(block)。
    如果D的返回值类型被声明为void,则A中包含的所有return语句不能指定表达式。

    如果D的返回值类型被声明为R,则A中包含的所有return语句不许指定一个能够隐式转换为R的表达式。A中的块(block)的终点必须可达。

    除了和相兼容的委托类型之间的隐式转换,匿名方法表达式(anonymous-method-expression)与任何类型之间不存在任何转换,包括object类型。

    下面的例子详细地解释了这些规则:

delegate void D(int x);

D d1 = delegate { };                    // 正确
D d2 = delegate() { };                  // 错误,签名不匹配
D d3 = delegate(long x) { };            // 错误,签名不匹配
D d4 = delegate(int x) { };             // 正确
D d5 = delegate(int x) { return; };     // 正确
D d6 = delegate(int x) { return x; };   // 错误,返回值不匹配

delegate void E(out int x);

E e1 = delegate { };                    // 错误,E带有一个输出参数
E e2 = delegate(out int x) { x = 1; };  // 正确
E e3 = delegate(ref int x) { x = 1; };  // 错误,签名不匹配

delegate int P(params int[] a);

P p1 = delegate { };                    // 错误,块的结尾不可达
P p2 = delegate { return; };            // 错误,返回值类型不匹配
P p3 = delegate { return 1; };          // 正确
P p4 = delegate { return "Hello"; };    // 错误,返回值类型不匹配

P p5 = delegate(int[] a) {              // 正确
    return a[0];
};

P p6 = delegate(params int[] a) {       // 错误,(译注:多余的)params修饰符
    return a[0];
};

P p7 = delegate(int[] a) {              // 错误,返回值类型不匹配
    if(a.Length > 0) return a[0];
    return "Hello";
};

delegate object Q(params int[] a);

Q q1 = delegate(int[] a) {              // 正确
    if(a.Length > 0) return a[0];
    return "Hello";
};

委托建立表达式
    委托建立表达式(delegate-creation-expression)可以用于匿名方法和委托类型之间的转换语法的替代品。如果一个委托建立表达式(delegate-creation-expression)的参数表达式(expression)是一个匿名方法表达式(anonymous-method-expression),则匿名方法依照上面定义的隐式转换规则转换为给定的委托类型。例如,如果D是一个委托类型,则表达式

new D(delegate { Console.WriteLine("hello"); })

等价于表达式

(D) delegate { Console.WriteLine("hello"); }

6页 第2上一页123456下一页
相关的教程: CSharp 匿名方法
收藏此教程

当前平均分: 0.0(0 次打分)

-5-4-3-2-1012345
评论主题
您的大名
您的评论
验证码 点击换一个验证码
知识库搜索: