19

varキーワードを使用してクラスのフィールドを宣言したかったのですが、varメソッド内でしか機能しないようです。

私が持っているコードは次のようになります:

public static Dictionary<string, string> CommandList = new Dictionary<string, string>{};

そして私は持っていたかった:

public static var CommandList = new Dictionary<string, string>

なぜこれが不可能なのですか?

4

3 に答える 3

31

この件に関する私の記事:

フィールドに var がないのはなぜですか?

要約する:

  1. 「var」フィールドがある場合、フィールドのタイプは、式が分析されるまで決定できません。これは、フィールドのタイプを知る必要がある後で発生します。

  2. それらの参照に長い連鎖や循環がある場合はどうなるでしょうか? これらのアルゴリズムはすべて、トップレベルの型情報がそれらによって消費されるのではなく、それらから決定される世界で書き直してテストする必要あります

  3. 「var」フィールドがある場合、初期化子は匿名型にすることができます。フィールドがパブリックであるとします。匿名型のフィールドを公開する正しい方法について、CLR または CLS にはまだ標準がありません。

于 2009-12-18T17:07:28.140 に答える
6

C#リファレンスより

  • Visual C# 3.0 以降、メソッド スコープで宣言された変数 は、暗黙的な型 var を持つことができます。

また、C# プログラミング リファレンスから

  • var は、ローカル変数が同じステートメントで宣言および初期化されている場合にのみ使用できます。変数を null に初期化することも、メソッド グループまたは無名関数に初期化することもできません。
  • var は、クラス スコープのフィールドでは使用できません。

それはあなたが念頭に置いている使用法を意図したものではありません。

これの主な目的は、コードで匿名型をサポートできるようにすることです。さらに、ローカル変数を簡潔に指定できるという利点もあります。

于 2009-12-18T17:09:18.983 に答える
0

簡単な答えは、仕様が合法でないと言っているからです。;-)

一般的に、これはとにかくやりたいことではありません。メンバーの型は であってはなりIDictionary<string, string>ませんDictionary<string, string>。これは小さな問題ですが、一般的には、外部から見えるオブジェクトでインターフェイスを使用することをお勧めします。これにより、コードのクライアントに影響を与えずに後で型を変更できます。コンパイラは、その方向に導くためにちょっとしたヒントを与えているだけです。

于 2009-12-18T17:03:48.553 に答える