web-dev-qa-db-ja.com

varパラメーターなしのTryParse

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

string s = "Hello";

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

}

しかし、コンパイルエラーが表示されます: enter image description here

私が間違っているのは何ですか?追伸:プロジェクト設定では、C#6.0および.NET framework 4.6が設定されています。

88
Anton23

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

宣言式はC#6.0からカットされ、最終リリースには含まれていません。現在はできません。 GitHubに提案があります C#7の場合(今後の参照については this も参照してください)。

更新(2017年7月3日)

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

string s = "42";

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

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

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

これはC#7の新しい機能であり、パターンマッチングと組み合わせて使用​​されることが多い非常に素晴らしい機能です。この機能やその他の機能は、C#チームブログで発表されています 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; }
}
9
Patrick Hofman