Language Feature Roadmap - icsharpcode/ILSpy GitHub Wiki
Current language feature status of the master branch is detailed in #829. The following list shows all completed language versions.
- Language features that are checked are implemented in the current master branch of ILSpy and have a minimal test suite at least.
- Language features that are crossed out will likely never be implemented in the decompiler, either because
- they are not reproducible from compiled binaries (e.g. constant interpolated strings, Caller info attributes),
- or they are of limited use and would require too much work to implement in the decompiler (e.g. static and global using directives, expression bodied members).
C# 1
- XmlDoc (see also #163)
- switch(string) (see
Switch
tag as well) - goto case -> #316
- params
- unsafe -> #924
C# 2 (VS 2005)
- Generics
Partial types: These are not applicable in decompiled code, as the code is decompiled into exactly one part.- Anonymous methods
- Iterators
- Nullable types ->
Nullable<T>
- Getter/setter separate accessibility
- Method group conversions (delegates)
- Co- and Contra-variance for delegates and interfaces
- 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: These are not applicable in decompiled code, as the code is decompiled into exactly one part.
C# 4 (VS 2010)
- Dynamic binding -> #154
- Named arguments -> #950
- Optional arguments -> #1083
- Generic co- and contravariance
Embedded interop types ("NoPIA"): TODO
C# 5 (VS 2012)
- Asynchronous methods
Caller info attributes: In general it's not possible to remove the compiler-generated values, because that would require us to produce the exact original source code.
C# 6 (VS 2015)
- Compiler-as-a-service (Roslyn)
Import of static type members into namespace: Currently, there are no plans to emitusing static
declarations.- Exception filters (see #761)
- 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 (see #1012)
nameof operator: Similar to caller info attributes, this would require us to reproduce the exact source code. We could emitnameof
expressions in certain situations, e.g.throw new ArgumentException(nameof(parameter));
, but currently there are no plans to add this.- Dictionary initializer
- Allow 'Add' extension methods in collection initializers