0

非常に簡単な質問ですが、C# では次のことが可能です。

var a = new []{"hello"};
string[] b;
if ((b=a)!=null) { ... }

以下はそうではありません:

var a = new []{"hello"};
if ((string[] b=a)!=null) { ... }

2 番目の例で間違ったことをしていないことを確認したかっただけで、そのようなことは不可能です。(同様に、2 番目の例の側面はusing().

4

3 に答える 3

2

これは不可能です。C# では変数宣言は式ではなく「ステートメント」であるためです。ステートメントは値を生成しないため、式で使用できないと思います。

しかし、2 番目の最初の形式で使用する割り当ては、結果 (この場合は a の値) を生成する「式」であり、演算子を使用して別の式で使用できます。

MSDNからのより多くのコンテキスト。

具体的には次のとおりです。

宣言ステートメントは、ローカル変数または定数を宣言します。宣言ステートメントはブロックで許可されていますが、埋め込みステートメントとしては許可されていません。

したがって、「戻り値の欠如」というよりも「言語の制限」のように見えますが、それ (ステートメントの戻り値の欠如) はそのような制限に影響を与えたに違いありません。

于 2012-12-13T10:50:43.767 に答える
1

はい、そうです、そのようにすることはできません。

その理由は単純に、変数の宣言をconditional statementの一部にすることはできないためです。また、可能であっても、 condition validate toまたは validates tovariableに割り当てられるためです。をチェックすると表示されます。truefalseIL

したがって、明確で理解しやすいコードの観点から、コーダーから書くふりをするのは正しいです

string[] b;
if ((b=a)!=null) { ... }
于 2012-12-13T10:51:57.273 に答える
1

待って、

質問を簡単にするために。

できるよ、

var a = 0;
var b = 1;
var c = a = b;

しかし、あなたはできません。

var x = 0;
var x = var y = 1;

これは明らかなようです。

値を割り当てると、割り当てられた値が返されます。変数のインスタンス化または初期化はそうではありません。

ただし、ブロック宣言でインスタンス化できるケースについて言及しています。

using(var x = new SomeIDisposable(...

foreach(var y in SomeIEnumerable...

確かに他にもあります。これらは本質的に構文糖衣です。C# の設計者は、使いやすくするためにセマンティックの純度を落としました。彼らの意見では、コードが乱雑になるため、すべてのインスタンス化でこれを一般的に行っていないと思います。

于 2012-12-13T11:10:43.410 に答える