var paramなしのTryParse


93

C#6.0の新機能により、TryParseメソッド内で変数を宣言できます。私はいくつかのコードを持っています:

string s = "Hello";

if (int.TryParse(s, out var result))
{

}

しかし、コンパイルエラーが表示されます。 ここに画像の説明を入力してください

私は何を間違っていますか?PS:プロジェクト設定でC#6.0と.NET Framework 4.6が設定されています。

回答:


152

C#6.0の新機能により、TryParseメソッド内で変数を宣言できます。

宣言式はC#6.0からカットされ、最終リリースでは出荷されませんでした。現在、それはできません。C#7向けのGitHubでの提案があります(今後の参考のためにこれも参照してください)。

アップデート(2017年7月3日)

C#7の公式リリースでは、次のコードがコンパイルされます。

string s = "42";

if (int.TryParse(s, out var result))
{
     Console.WriteLine(result);
}

4
情報ありがとうございます!最終リリースから切り取られたのは気の利いた点ですが、私にとっては素晴らしい機能です。
Anton23 2015

2
@ Anton23それがC#7に入るといいのですが:)
Yuval Itzchakov

2
それは私にとって最も期待される機能でした。
Tuyen Pham 2015

少なくともC#7 / VS2017にあります。
ssmith 2017年

1
文字通りもう一文読めなかったのですか?状態C#7を行う答えも、それが6.0から切り取られたと説明しています。人々はまだC#6.0で開発しています
Fus Ro Dah

15

偶然発見されたばかりです。vs2017では、簡潔にするためにこれを行うことができます。

if (!Int64.TryParse(id, out _)) {
   // error or whatever...
}

2
それが破棄演算子です。
Patrick Hofman

9

これは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; }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.