C# 7.1 の新機能What's new in C# 7.1

C# 7.1 は C# 言語の最初のポイント リリースです。C# 7.1 is the first point release to the C# language. この言語のリリース サイクルが増えたことになります。It marks an increased release cadence for the language. 新機能は間もなく使用できます。理論的には、各々の新機能が用意できたときに使用できます。You can use the new features sooner, ideally when each new feature is ready. C# 7.1 では、特定のバージョンの言語に合わせるようにコンパイラを構成する機能が追加されます。C# 7.1 adds the ability to configure the compiler to match a specified version of the language. ツールをアップグレードする決定と言語バージョンをアップグレードする決定を分けることができます。That enables you to separate the decision to upgrade tools from the decision to upgrade language versions.

C# 7.1 では、言語バージョン選択構成要素、3 つの新しい言語機能、新しいコンパイラ動作が追加されます。C# 7.1 adds the language version selection configuration element, three new language features, and new compiler behavior.

このリリースの新しい言語機能は次のとおりです。The new language features in this release are:

最後に、コンパイラには、参照アセンブリ生成を制御する 2 つのオプション、-refout-refonly があります。Finally, the compiler has two options -refout and -refonly that control reference assembly generation.

ポイント リリースで最新の機能を使用するには、コンパイラ言語バージョンを構成し、バージョンを選択する必要があります。To use the latest features in a point release, you need to configure the compiler language version and select the version.

この記事の残りでは、各機能の概要について説明します。The remainder of this article provides an overview of each feature. 機能ごとに、その背後にある論拠のほか、For each feature, you'll learn the reasoning behind it. 構文についても説明します。You'll learn the syntax. dotnet try グローバル ツールを使って、これらの機能をご自身の環境で調べることができます。You can explore these features in your environment using the dotnet try global tool:

  1. dotnet try グローバル ツールをインストールします。Install the dotnet-try global tool.
  2. dotnet/try-samples リポジトリを複製します。Clone the dotnet/try-samples repository.
  3. 現在のディレクトリを、try-samples リポジトリの csharp7 サブディレクトリに設定します。Set the current directory to the csharp7 subdirectory for the try-samples repository.
  4. dotnet try を実行します。Run dotnet try.

async mainAsync main

async main メソッドにより、Main メソッドで await を使用できます。An async main method enables you to use await in your Main method. 以前は次のように記述する必要がありました。Previously you would need to write:

static int Main()
{
    return DoAsyncWork().GetAwaiter().GetResult();
}

それが次のように記述できるようになりました。You can now write:

static async Task<int> Main()
{
    // This could also be replaced with the body
    // DoAsyncWork, including its await expressions:
    return await DoAsyncWork();
}

プログラムによって終了コードが返されない場合、Task を返す Main メソッドを宣言できます。If your program doesn't return an exit code, you can declare a Main method that returns a Task:

static async Task Main()
{
    await SomeAsyncMethod();
}

プログラミング ガイドの async main の記事に詳細があります。You can read more about the details in the async main article in the programming guide.

既定のリテラル式Default literal expressions

既定のリテラル式は既定の値式の拡張版です。Default literal expressions are an enhancement to default value expressions. これらの式によって変数が初期化され、既定値になります。These expressions initialize a variable to the default value. 以前は次のように記述していました。Where you previously would write:

Func<string, bool> whereClause = default(Func<string, bool>);

それが今では、初期化の右項で種類を省略できるようになりました。You can now omit the type on the right-hand side of the initialization:

Func<string, bool> whereClause = default;

詳しくは、「default 演算子」記事の「default リテラル」セクションをご覧ください。For more information, see the default literal section of the default operator article.

推論されたタプル要素の名前Inferred tuple element names

この機能は、C# 7.0 で導入されたタプル機能の小規模拡張です。This feature is a small enhancement to the tuples feature introduced in C# 7.0. タプルを何度初期化しても、代入の右項に使用される変数は、タプル要素に使用するものと同じ名前になります。Many times when you initialize a tuple, the variables used for the right side of the assignment are the same as the names you'd like for the tuple elements:

int count = 5;
string label = "Colors used in the map";
var pair = (count: count, label: label);

タプル要素の名前は、C# 7.1 でタプルの初期化に使用される変数から推測できます。The names of tuple elements can be inferred from the variables used to initialize the tuple in C# 7.1:

int count = 5;
string label = "Colors used in the map";
var pair = (count, label); // element names are "count" and "label"

この機能の詳細については、タプルに関する記事を参照してください。You can learn more about this feature in the Tuples article.

ジェネリック型パラメーターのパターン マッチPattern matching on generic type parameters

C#7.1 以降では、is 型パターンと switch 型パターンのパターン式は、ジェネリック型パラメーターの型を持つことができます。Beginning with C# 7.1, the pattern expression for is and the switch type pattern may have the type of a generic type parameter. これは struct 型か class 型のいずれかである可能性がある型を確認し、ボックス化を回避するときに最も役立ちます。This can be most useful when checking types that may be either struct or class types, and you want to avoid boxing.

参照アセンブリ生成Reference assembly generation

"参照専用アセンブリ" を生成する新しい 2 つのコンパイラ オプション -refout-refonly があります。There are two new compiler options that generate reference-only assemblies: -refout and -refonly. リンク先の記事には、オプションと参照アセンブリに関する詳細があります。The linked articles explain these options and reference assemblies in more detail.