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 { }

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

4

5 に答える 5

101

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

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

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

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

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

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

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

于 2012-05-11T09:43:55.613 に答える
18

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

于 2012-05-11T09:44:26.993 に答える
12

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

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

于 2012-05-11T09:59:41.963 に答える
8

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

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

intandtrueは C# 1 以降のキーワードです。

于 2012-05-11T09:45:40.770 に答える
3

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

于 2012-05-11T16:22:41.640 に答える