web-dev-qa-db-ja.com

C#では、varを使用して複数の変数を宣言できないのはなぜですか?

以下を考慮してください:

// not a problem
int i = 2, j = 3;

それで、これが私を驚かせます:

// compiler error: Implicitly-typed local variables cannot have multiple declarators
var i = 2, j = 3;

コンパイルしません。たぶん、これについてわからないことがあるのです(これが私がこれを尋ねている理由です)?

しかし、コンパイラが私が意図したことを理解しないのはなぜですか?

var i = 2;
var j = 3;

コンパイルします。

46
aarona

これは、プログラマーとコンパイラーが混乱する可能性があるもう1つのポイントです。

たとえば、これは問題ありません:

double i = 2, j = 3.4;

しかし、これはどういう意味ですか?

var i = 2, j = 3.4;

構文糖に関しては、この種のことは誰も必要としない頭痛の種です。ですから、あなたのケースがサポートされることはないでしょう。それは、あまりにも多くのコンパイラが少し賢すぎるようにしようとすることを含みます。

39
James Gaunt

この機能を設計したとき、私はコミュニティに何を尋ねました

var x = 1, y = 1.2;

意味する必要があります。質問と回答はここにあります:

http://blogs.msdn.com/b/ericlippert/archive/2006/06/26/what-are-the-semantics-of-multiple-implicitly-typed-declarations-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2006/06/27/what-are-the-semantics-of-multiple-implicitly-typed-declarations-part-two.aspx

簡単に言えば、約半分の回答者は明らかに正しいことはxとyの両方を倍にすることであり、約半分の回答者は明らかに正しいことはx intとyを倍にすることであると述べました。

(言語委員会はそれが「double」であると指定し、実際に出荷する前にその方法でコードを実装しました。すべての式が最高の要素タイプ。)

顧客ベースの半分が1つは「明らかに正しい」と考え、もう半分は反対が「明らかに正しい」と考えている場合、大きな設計上の問題を抱えています。解決策は、すべてを違法にして問題を回避することでした。

59
Eric Lippert

これがうまくいった場合:

var i = 2, j = 3;

これが機能するため:

var i = 2;
var j = 3;

次に、これが機能することを期待します。

var i = 2, j = "3";

これが機能するため:

var i = 2;
var j = "3";

James Gauntによって提案された場合でも、どちらも数値型であり、同じ型の値に格納できる場合、iはどの型になりますか?:

var i = 2, j = 3.4;

jは明らかにdoubleですが、iは、varが型を推測する方法に応じて、論理的にはintまたはdoubleのいずれかになります。どちらの方法で実装されたとしても、それが他の方法で機能することを期待していた人々と混乱するでしょう。

このすべての混乱を避けるために、それは単に許可されていません。私は個人的にはそれを大きな損失とは考えていません。変数のリストを宣言したい場合(それ自体は私の実務経験ではかなりまれです)、emと強く入力します。

6
KeithS

私はそれはあまりにも不明瞭だと思います。 2つの変数が同じ型である場合、それは簡単な特定のケースですが、より一般的なケースでは、次のようなコードで「正しい」ものを考慮する必要があります。

var x = new object(), y = "Hello!", z = 5;

それらはすべてobjectとして入力する必要があります。これは、それらすべてが共通して持っている唯一のタイプだからです。または、xobjectystringzintにする必要がありますか?

このように宣言された変数(すべて1行で)は通常すべて同じ型であると想定されるため、一方では前者を考えるかもしれません。一方、varキーワードは通常、コンパイラーに最も具体的なタイプを推測させるため、後者だと思うかもしれません。

いずれにしても「キラー」機能とは限らないため、これを完全に禁止する方が、動作を正確に検討するよりもましです。

それは少なくとも私の意見/推測です。

4
Dan Tao

それは、コンパイラの場合は次のようになる可能性があるためだと思います:

var i = 2, j = "three"

そして、それらは確かに同じタイプのものではありません。

1
Ilya Dvorovoy