Mi capita spesso di ricercare in quale versione di C# è stata introdotta una certa funzionalità, o al contrario, voler capire quali sono le novità introdotte in una data versione.
Una mia storia delle versioni di C# è naturalmente presente nelle varie edizioni del mio libro “Programmare con C#” (al momento la più recente è la versione su C# 7).
Nell’attesa di lavorare ad una nuova edizione, mi tengo naturalmente al passo con i tempi, e soprattutto per sfruttare le migliorie apportate al linguaggio, ad ogni nuova release, presente e futura, vado a cercare queste nuove funzioni.
Nella repository GitHub ufficiale del linguaggio C#, sono presenti tutti i documenti di progetto, sia quelli passati, che le nuove proposte per il futuro.
Inoltre la pagina Features Added in C# Language Versions riassume tutte le versioni, con relative funzionalità introdotte e versione di Visual Studio che le comprende.
Ad oggi (giugno 2018) l’elenco delle versioni di C# parte dalla 1.0 e arriva alla 7.3, ed è riassunta qui di seguito:
C# 1.0 (Visual Studio.NET)
Classes
Structs
Interfaces
Events
Properties
Delegates
Expressions
Statements
Attributes
Literals
C# 2 (VS 2005)
Generics
Partial types
Anonymous methods
Iterators
Nullable types
Getter/setter separate accessibility
Method group conversions (delegates)
Static classes
Delegate inference
C# 3 (VS 2008)
Implicitly typed local variables
Object and collection initializers
Auto-Implemented properties
Anonymous types
Extension methods
Query expressions
Lambda expression
Expression trees
Partial methods
C# 4 (VS 2010)
Dynamic binding
Named and optional arguments
Co- and Contra-variance for generic delegates and interfaces
Embedded interop types (“NoPIA”)
C# 5 (VS 2012)
Asynchronous methods
Caller info attributes
C# 6 (VS 2015)
Draft Specification online
Compiler-as-a-service (Roslyn)
Import of static type members into namespace
Exception filters
Await in catch/finally blocks
Auto property initializers
Default values for getter-only properties
Expression-bodied members
Null propagator (null-conditional operator, succinct null checking)
String interpolation
nameof operator
Dictionary initializer
C# 7.0 (Visual Studio 2017)
Out variables
Pattern matching
Tuples
Deconstruction
Discards
Local Functions
Binary Literals
Digit Separators
Ref returns and locals
Generalized async return types
More expression-bodied members
Throw expressions
C# 7.1 (Visual Studio 2017 version 15.3)
Async main
Default expressions
Reference assemblies
Inferred tuple element names
Pattern-matching with generics
C# 7.2 (Visual Studio 2017 version 15.5)
Span and ref-like types
In parameters and readonly references
Ref conditional
Non-trailing named arguments
Private protected accessibility
Digit separator after base specifier
C# 7.3 (Visual Studio 2017 version 15.7)
System.Enum, System.Delegate and unmanaged constraints.
Ref local re-assignment: Ref locals and ref parameters can now be reassigned with the ref assignment operator (= ref).
Stackalloc initializers: Stack-allocated arrays can now be initialized, e.g. Span<int> x = stackalloc[] { 1, 2, 3 };.
Indexing movable fixed buffers: Fixed buffers can be indexed into without first being pinned.
Custom fixed statement: Types that implement a suitable GetPinnableReference can be used in a fixed statement.
Improved overload candidates: Some overload resolution candidates can be ruled out early, thus reducing ambiguities.
Expression variables in initializers and queries: Expression variables like out var and pattern variables are allowed in field initializers, constructor initializers and LINQ queries.
Tuple comparison: Tuples can now be compared with == and !=.
Attributes on backing fields: Allows [field: …] attributes on an auto-implemented property to target its backing field.
N.B.
nella repository è presente anche il documento delle proposte che potrebbero vedere la luce con la versione C# 8!