2012-05-11 5 views
101

varはC#のキーワードですか?しかし、なぜ私はこれを行うことができます。コード内で使用されてなぜ "var"という名前のクラスを作成できますか?

public class var { } 

public class main 
{ 
    public static void main(string[] args) 
    { 
     var testVar = new var(); 
    } 
} 

varmainクラスの前に宣言されているvarクラスです。コンパイラは不平を言うことさえしません。

public class int { } 

またはこの:私はこれを行うときながら

public class true { } 

コンパイラがintまたはtrueがキーワードであり、そのように使用することはできないと述べました。 varと同じではないのはなぜですか?

+6

なぜあなたはしたいですか?とても混乱して読みにくいです。 – duffymo

+0

'dynamic'キーワードはどうですか?それも使用できますか? –

+6

この記事をお読みください:http://blogs.msdn.com/b/ericlippert/archive/2009/05/11/reserved-and-contextual-keywords.aspx – AakashM

答えて

101

varは、according to this listというキーワードではありません。

コンテキストキーワードであるため、コンパイラはどちらがあなたのクラスであり、どれがコンテキストキーワードであるかを判断することができ、混乱は生じません。コード内の特定の意味を提供するために使用さ

が、それはC#で 予約語ではありません。

コンテキストキーワードがあります。

そのように予約されていないので、使用することができます。

としては、そこの違いの議論があるだけでなく、様々なキーワードやコンテキストキーワードのリストがEric Lipperts blog

上のC#の各バージョンで追加以降のことに注意することは興味深いことである上記のコメントで指摘しましたC#1.0では、後方互換性を保つために、追加されていないことが決定されました。

+1

しかし、ここでは "C#Keywords"に分類されています。http://msdn.microsoft.com/en-us/library/bb383973.aspx ...混乱します! – Richard

+4

しかし、それは['文脈のキーワード'](http://msdn.microsoft.com/en-us/library/x53a06bb.aspx)です。 _ "コンテキストキーワードは、コード内で特定の意味を提供するために使用されますが、**はC#**の予約語ではありません。部分キーワードや部分キーワードなどのいくつかのコンテキストキーワードは2つ以上のコンテキストで特別な意味を持ちます。 _ –

+5

@TimSchmelter "var"は "キーワード"です。ちょうど "予約語"ではない、そう? – luiscubal

18

コンパイラは、クラス名としてvarを使用しているコンテキストが決してキーワードのコンテキストではないことを知るために十分にスマートです(したがって、contextual keywordとして定義されています)。

+0

私はこの答えは少なくとも多少の誤解を招くと思います。コンパイラは 'var test'が' var testVar = new var(); 'のようにコード内でキーワードとして使われているかどうかを判断するのに十分にスマートではありません。はい、文脈は、 'var'という名前のカスタム型が定義されているかどうかという観点から見れば、コンパイラは' var testVar'がクラス ' var'またはキーワード 'var'に渡されます。これは、そのようなコンテキストでクラスにデフォルト設定されます。 'var'キーワードの名前が異なっていたとしても、それはまったく同じ"コンテキスト "で使用できました。 –

+0

ここでは、 'add'のような他のコンテキストキーワードと比較すると、コンパイラは実際にキーワードが意味されているかどうか(イベント宣言;識別子は意味をなさない)、またはコードが識別子(宣言の型または名前、メソッド本体内での識別子の使用、キーワードは意味をなさない)。 –

8

バージョン3より前のC#バージョンでは、implicitly typed local variablesはまだサポートされていなかったので、varに特別な意味はなく、varという名前の変数とクラスを定義することができました。あなたのサンプルプログラムは、varmainの両方の出現がクラスvarと呼ばれているので、合法です。

C#3以降のバージョンは下位互換性があるため、バージョン3より前のC#で書かれたコードは新しいコンパイラでコンパイルされます。キーワードはそう、(「INT」と「真」とは違って)C#の最初のバージョンではなかったとして「VAR」:

inttrueは、C#ので、これを見ているの1

12

別の方法キーワードですあなたは "var"というクラスを持ったコードを書いているかもしれません。これは完全にうまく合法であった。その後、 "var"が言語に追加されたとき、デザイナーは特定のコンテキストでのみキーワードにするように親切でしたので、既存のvarクラスは引き続き動作します。

これは、既存のコードを壊さずに新しい機能を追加する方法と、新しい機能を使用するのが面倒ではない、言語デザインの本当の課題の1つです。

3

キーワードはコンテキストに基づいて予約できます。ソースコードが解析されると、そのコンテキストは解析ツリーの一部として確立されます。キーワードの評価は、そのコンテキスト内で行われます。したがって、この場合、varは予約されたコンテキストにはなく、代入文でvarを使用しているときと同じ意味を持ちません。この柔軟性の理由の1つは、varがC#3で導入されたことだと思うので、どこにでも予約されていると、いくつかのプログラムで下位互換性が壊れている可能性があります。破損。

関連する問題