In this chapter, we reviewed some C# 1.x and 2.0 concepts, such as generics, anonymous methods, and iterators and yield. These concepts are all very important to understanding the C# 3.0 extensions. We also covered the new features of C# 3.0 that are the basis for LINQ: local type inference, lambda expressions, extension methods, object initializers, and anonymous types.
The more visible changes in C# 3.0 are the query expressions. We will cover their syntax in more detail in Chapter 4, together with an explanation of the LINQ architecture.