C# 8.0はまだ数ヶ月先にあるが、C# 8.xの計画は始まっている。これらの機能の中には新しいものもあれば、以前にC# 8向けに検討されたものもある。そしていつものように、このリストは変更される可能性がある。
前のレポートで説明したように、Caller Expression Attribute機能を使用すると、関数が引数を生成するために使用される式をキャプチャできる。これは主にアサーションと自動テストで使用される。
正式にはTarget-Typed new Expressionと呼ばれる、新しいキーワードの型推論は、型の名前がコンテキストによって決定される可能性がある状況で定型コードを減らす。
現在の意見はこの機能に対しておおよそ3:1であるが、Defer(保留)ステートメントは、8.xリリースで検討されている機能のリストに残っている。
Null拡張された共通タイプ
これは実際には、#33と#881の2つのリクエストであり、null許容値型と3項演算子を扱うときに明示的キャストを追加する必要がなくなった。Null拡張された共通タイプ提案の下では、次のシナリオは許可されるでしょう。
int a;
int? x1 = condition ? a : null;
int? b;
double c;
double? x2 = condition ? b : c;
この改善は、配列の型またはラムダ式の戻り型を推測するときにもサポートされる。
宣言式
Cベースの言語の特徴は代入が、ただのステートメントでなく式であることである。これはa = b = c = 0のようなショートカットだけでなく、if ( a = false)のような間違いも許す。このため、多くのスタイルガイドでは、他のステートメント内で変数を変更することを禁止している。
C#は、outパラメータやパターンマッチングの一部など、新しい場所で変数を定義する機能を備え、他の方向に向かっている。宣言式を使用すると、代入を実行できる場所であればどこでも変数を宣言できる。
以前は、次のように書くことができた。
char ch;
while ((ch = GetNextChar()) == 'a' || ch == 'b' || ch == 'c')
それを次のように短くすることができる。
while ((char ch = GetNextChar()) == 'a' || ch == 'b' || ch == 'c')
下記はもう一つの例である。
var sum = (var p = GetPoint(); p.X + p.Y);
関連機能として、デコンストラクションで宣言と変数を混在させることができる。C# 7.1で最初に提案されたが、これは、全てではないが、いくつかの変数が新しく定義されたときに複数代入を許可する。
(x, var y) = e;
ローカル機能の強化
ローカル関数の制限は、属性をローカル関数に適用することはできないということである(これはC#の制限に過ぎずCLRは許可している)。C# 8でこれが問題になる可能性がある理由は、NULLを許容するかのチェックに正しい意味を持たせるためにNotNullWhenTrueなどの属性が必要になる可能性があることである。
別の例では、ローカル関数の属性を使用して、より便利にASP.NETルーティングを構成することができる。