"C#5.0 PDF C#学习"
这篇文档是关于C# 5.0语言规范的详细概述,其中特别关注了匿名函数转换,包括匿名方法和lambda表达式。匿名函数是一种没有名称的函数,它可以在需要函数的地方直接使用,而无需预先声明。在C#中,匿名函数主要通过lambda表达式来实现。
6.5章节详细描述了匿名函数转换的规则,匿名函数可以被隐式转换为与之兼容的委托类型或表达式目录树类型。这种兼容性主要基于以下几个条件:
1. 如果匿名函数有参数列表,那么对应的委托类型必须有相同数量的参数。
2. 如果匿名函数没有参数列表,委托类型可以接受任意数量的参数,但不能有`out`参数修饰符。
3. 如果参数类型是显式指定的,那么两个函数的参数类型和修饰符必须匹配。
4. 对于只有单个表达式的匿名函数,如果委托类型返回`void`或对于异步函数返回`Task`,则该表达式必须是一个有效的语句表达式。
5. 当函数体是语句块并且返回类型为`void`或`Task`时,函数体必须是有效的无返回语句块,且不应包含有返回值的`return`语句。
6. 如果函数体是表达式,并且非异步函数的委托返回类型非空,或者异步函数的委托返回类型为`Task<T>`,那么表达式应能隐式转换为该类型。
7. 对于返回类型为非空的语句块,每个`return`语句都应该有一个可隐式转换为返回类型的表达式。
文中还提到了,lambda表达式可以转换为表达式树类型`Expression<D>`,但匿名方法不支持这一点。同时,有些lambda表达式不能转换为表达式树,例如含有block体、赋值运算符、动态绑定表达式或异步操作的。
举例来说,`Func<int, int>`是一个泛型委托类型,它接收一个`int`类型参数并返回一个`int`类型值。下面的赋值`Func<int, int> f1 = x => x + 1;`是合法的,因为它定义了一个接受整数并返回整数的匿名函数,这与`Func<int, int>`的签名相符。
整个文档深入地探讨了C# 5.0中的各种语言特性,从基本的程序结构、类型和变量,到类和对象的详细设计,再到委托、接口、枚举等高级概念,为学习C#提供了全面的指导。此外,它还详细阐述了词法结构,如标记、注释和Unicode字符的处理,以及语法分析的过程。