「var」という名前のクラスを作成できるのはなぜですか?


103

varC#のキーワードではないですか?しかし、なぜこれができるのですか?

public class var { }

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

varコード内で使用されていることであるvar前に宣言されたクラスmainクラス。そしてコンパイラーも文句を言いません。

私がこれをするとき:

public class int { }

またはこれ:

public class true { }

コンパイラはintor trueはキーワードであり、そのようには使用できないと言っています。なぜ同じではないのvarですか?


6
なぜしたいですか?とてもわかりにくく、読みにくい。
duffymo


31
var'y good question!
Richard

50
var var = "var";メソッドで行うこともできます。結局、それは金曜日です。
Henk Holterman、2012年

11
「var」が何か特別なことを意味する前に作成されたコードとの下位互換性を保つために、彼らはこのようにしたと思います。
vidstige

回答:


101

varこのリストによると、キーワードではありません。

これはコンテキストキーワードであるため、コンパイラはコンテキストから、どちらがクラスであり、どちらがコンテキストキーワードであるかを判断でき、混乱は生じません。

コンテキストキーワードは次のとおりです。

コードで特定の意味を提供するために使用されましたが、C#では予約語ではありません。

予約されていないので使用できます。

上記のコメントで指摘されているように、Eric Lippertsブログの c#の各バージョンで追加されたさまざまなキーワードとコンテキストキーワードのリストだけでなく、違いについても説明されています。

興味深いのは、一連のキーワードがC#1.0で決定されたため、下位互換性を維持するために追加されていないことです。


1
ただし、ここでは「C#キーワード」に分類されています。msdn.microsoft.com/ en-us / library / bb383973.aspx ...紛らわしいです。
Richard

4
しかし、それはContextual Keywordです。「コンテキストキーワードは、コード内で特定の意味を提供するために使用されますが、C#では予約語ではありません。パーシャルや場所などの一部のコンテキストキーワードは、2つ以上のコンテキストで特別な意味を持っています。」
Tim Schmelter

5
@TimSchmelter次に、「var」は「キーワード」です。ただ「予約語」ではないですよね?
luiscubal

2
私はそれが古いコードとの互換性を維持することだと思います-誰かがその名前のクラスを持っていた場合、varC#のアップグレード時にすべてが壊れるわけではありません。
Callum Rogers

1
@CallumRogers:C#チームがこれを行ったのはまさにそのためです。from、joinなど、後に導入される他の「キーワード」についても同様です(ちなみにすべて文脈依存です)。
アベル

18

コンパイラーはvar、クラス名として使用しているコンテキストがキーワードのコンテキストではないことを認識できるほど賢いので、それを許可します(そのため、コンテキストキーワードとして定義されています)。


この答えは少なくとも多少誤解を招くと思います。コンパイラは、がのvarようなコードでキーワードとして使用されているかどうかを判断するのに正確に「スマート」ではありませんvar testVar = new var();。はい、名前付きのカスタム型varが定義されたかどうかという点でコンテキストがそれに影響しますが、それは、コンパイラがクラスを参照しているか、それがデフォルトでクラスに指定されているキーワードを参照しているかを知るほどスマートではないためですそのような状況で。た別の名前のキーワードが、それは非常に同じ「文脈」で使用することができます。var testVarvarvarvar
またはMapper 14

これとは対照的に、addここでは、コンパイラーはキーワードが意味するのか(イベント宣言。識別子はそこで意味をなさない)、またはコードが識別子(型または宣言内の名前、メソッド本体内での識別子の使用、キーワードはそこでは意味をなさないでしょう)。
またはMapper 2014

12

これを見る別の方法:キーワードとしての "var"は、C#の最初のバージョン( "int"や "true"とは異なります)にはなかったため、 "var"というクラスを持つコードを作成した可能性があります。これは完全に問題なく合法でした。その後、言語に「var」が追加されたとき、デザイナーは特定のコンテキストでのみキーワードになるように親切でしたので、既存のvarクラスは引き続き機能します。

これは、言語設計の真の課題の1つです。既存のコードを壊すことなく、また新機能を使いにくくすることなく、新機能を追加する方法です。


8

バージョン3より前のC#バージョンでは、暗黙的に型指定されたローカル変数はまだサポートされてvarいないため、特別な意味はなく、という名前の変数とクラスを定義できましたvar。の両方のオカレンスがクラスvarmain参照しているため、サンプルプログラムは合法varです。

C#3以降のバージョンは下位互換性があるため、バージョン3より前のC#で記述されたコードは、新しいコンパイラーでもコンパイルできます。

intそして、trueC#1がキーワードです。


3

キーワードは状況に応じて予約できます。ソースコードが解析されると、そのコンテキストは解析ツリーの一部として確立されます。キーワードの評価は、そのコンテキスト内で行われます。したがって、この場合、varは予約されたコンテキストではなく、割り当てステートメントで使用する場合と同じ意味を持ちません。この柔軟性の理由の1つは、varがC#3で導入されたためだと考えられます。varをどこでも予約すると、一部のプログラムでは下位互換性が失われる可能性がありますが、変数の型宣言として使用すると、以前のバージョンではコンパイルされなかったため、破損。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.