Skip to content

Language Feature Roadmap

Siegfried Pammer edited this page Dec 5, 2021 · 6 revisions

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 emit using 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 emit nameof 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