49

以下を考えると:

// 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;

コンパイルします。

4

5 に答える 5

61

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

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 の両方を 2 倍にすることであり、約半数の回答者が明らかに正しいことは x int と y を 2 倍にすることだと言いました。

(言語委員会はそれが「double」であるべきだと指定し、出荷前に実際にそのコードを実装しました。暗黙的に型指定された配列と同じ型推論アルゴリズムを使用しました。ここでは、すべての式が に変換可能でなければなりません最適な要素タイプ)。

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

于 2011-02-09T21:22:18.140 に答える
44

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

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

double i = 2, j = 3.4;

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

var i = 2, j = 3.4;

シンタックス シュガーでは、この種のことは誰も必要としない頭痛の種です。少し賢くなりすぎようとするコンパイラが多すぎます。

于 2011-02-09T20:36:52.000 に答える
7

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

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ですが、ivarが型を推測する方法に応じて、論理的にはintまたはdoubleのいずれかになります。いずれにせよ、それが他の方法で機能することを期待していた人々と混乱を引き起こすでしょう。

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

于 2011-02-09T20:43:16.740 に答える
4

あやふやすぎると思います。2 つの変数が同じ型の場合は簡単な特定のケースですが、より一般的なケースでは、次のようなコードで何が「正しい」かを考慮する必要があります。

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

objectそれらがすべて共通に持っている唯一の型であるため、それらはすべて として型付けする必要がありますか? それとも、あるべきxobjectyあるべきかstring、そしてzあるべきintか?

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

とにかく「キラー」機能ではないことを考えると、これがどのように動作するかを正確に考えるよりも、これを完全に禁止する方がよいでしょう。

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

于 2011-02-09T20:39:56.020 に答える
1

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

var i = 2, j = "three"

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

于 2011-02-09T20:37:27.130 に答える