3

ですから、実際の問題に対する質問としては、あまり良い質問ではないかもしれませんが、それは私を悩ませ、答えを見つけることができないので、それは問題だと思います。

の特異性はvar何ですか?それに関するMSDNリファレンスには次のように記載されています。

暗黙的に型付けされたローカル変数は、自分で型を宣言したかのように強く型付けされます

強いタイプがどのタイプであるかはどこにもわからないようです。たとえば、次のような場合です。

var x = new Tree();

しかし、私はのメソッドを呼び出さずTreexまだ強く型付けされていtreeますか?または、次のようなものがありますか?

var x = new Tree();
x = new Object();

これは許可されていないと思いますが、現在コンパイラにアクセスできません。上記のような予期しない動作を許可する警告があるかどうか本当に疑問に思っています。

4

6 に答える 6

10

右側の式のタイプに強く型付けされています。

varキーワードは、初期化ステートメントの右側にある式から変数の型を推測するようにコンパイラーに指示します。

ここから。

于 2012-12-13T20:25:21.973 に答える
6

等号の右側の型に関連付けられているため、この場合は次のようになります。

Tree x = new Tree();

インターフェイスまたは基本クラスがに関連付けられているかどうかに関係なくTree。より低いタイプである必要xがある場合は、次のように具体的に宣言する必要があります。

Plant x = new Tree();
// or
IHasLeaves x = new Tree();
于 2012-12-13T20:25:39.480 に答える
2

はい、あなたの例xでは強くタイプされていTree just as if you had declared the type yourselfます。

を再定義しているため、2番目の例はコンパイルされませんx

于 2012-12-13T20:25:30.203 に答える
2

いいえ、入力した場合はまったく同じですTree x = new Tree();。明らかに、コンパイラが実行できる唯一の明確な推論は、右辺の式の正確なタイプであるため、突然になることはありません。ITree x

したがって、これは機能しません。

Tree x = new Tree();
x = new Object(); //cannot convert implicitly

興味がある場合は、dynamic期待する動作に近いです。

dynamic x = new Tree();
x = new Object(); 
于 2012-12-13T20:34:38.457 に答える
1

例では:

var x = new Tree();

と同じです

Tree x = new Tree();

コードのリファクタリングを容易にするため、「var」を使用する方が常に優れていることがわかりました。

また、追加、

var x = new Object();

同じスコープ内では、変数を2回宣言できないため、コンパイルが中断されます。

于 2012-12-13T20:28:23.937 に答える
0

var型ではなく、変数を特別なものにするものでもありません。代入演算子の右側にある初期化式を分析することにより、コンパイラにATCOMPILETIMEで変数の型を推測するように指示します。

これらの2つの式は同等です。

Tree t = new Tree();

var t = new Tree();

個人var的には、タイプ名が右側に明示的に記載されている場合、または正確なタイプが複雑で、LINQクエリから返される結果とはあまり関係がない場合に使用することを好みます。これらのLINQの結果は、多くの場合、さらに処理される単なる中間結果です。

var x = new Dictionary<string, List<int>>();

次のステートメントよりも読みやすく、しかも非常に明確です。

Dictionary<string, List<int>> x = new Dictionary<string, List<int>>();
var query = someSource
    .Where(x => x.Name.StartsWith("A"))
    .GroupBy(x => x.State)
    .OrderBy(x => x.Date);

これqueryはタイプIOrderedEnumerable<IGrouping<string, SomeType>>です。誰も気にしない?


タイプ名が右側に表示されず、単純な場合は、使用するものが単純化されないため、明示的に記述することをお勧めしますvar

int y = 7;
string s = "hello";

そして当然のことながら、匿名型を作成するvar場合は、型名がないため、使用する必要があります。

var z = new { Name = "Coordinate", X = 5.343, Y = 76.04 };

このvarキーワードは、使用を簡素化し、SQLでの作業方法をシミュレートするためにその場で型を作成できるようにするために、LINQとともに導入されました。

SELECT Name, Date FROM Person
var result = DB.Persons.Select(p => new { p.Name, p.Date });
于 2012-12-13T20:48:24.283 に答える