回答:
C#6.0の新機能により、TryParseメソッド内で変数を宣言できます。
宣言式はC#6.0からカットされ、最終リリースでは出荷されませんでした。現在、それはできません。C#7向けのGitHubでの提案があります(今後の参考のためにこれも参照してください)。
C#7の公式リリースでは、次のコードがコンパイルされます。
string s = "42";
if (int.TryParse(s, out var result))
{
Console.WriteLine(result);
}
偶然発見されたばかりです。vs2017では、簡潔にするためにこれを行うことができます。
if (!Int64.TryParse(id, out _)) {
// error or whatever...
}
これはC#7の新機能で、パターンマッチングと組み合わせてよく使用される非常に優れた機能です。この機能などは、C#チームのブログ「What's New in C#7.0」で発表されています。
ここでチームが達成しようとしているのは、より流動的なコードです。out変数のリストが無用に非常に長くなっているいくつかのケースを覚えていますか?簡単な例:
int i;
Guid g;
DateTime d;
if (int.TryParse(o, out i)) { /*use i*/ }
else if (Guid.TryParse(o, out g)) { /*use g*/ }
else if (DateTime.TryParse(o, out d)) { /*use d*/ }
問題がわかりましたか?それらの変数すべてがそこに座って何もしないことは意味がありません。C#7を使用すると、行数を半分に減らすことができます。
if (int.TryParse(o, out int i)) { /*use i*/ }
else if (Guid.TryParse(o, out Guid g)) { /*use g*/ }
else if (DateTime.TryParse(o, out DateTime d)) { /*use d*/ }
行数が最小限に抑えられるだけでなく、スコープ内に必要のない変数のリストが不要になることもありません。これにより、使用するつもりがなかった変数を使用できなくなりますが、現在は表示されています。
この機能はswitch
、次のコード(上記のコードとは動作が異なります)のように、ステートメント内のパターンマッチングにも役立ちます。
switch (o)
{
case int i: { /*use i*/ break; }
case Guid g: { /*use g*/ break; }
case DateTime d: { /*use d*/ break; }
}