2011-01-05 17 views
6

私が尋ねる理由は、メソッドのパラメータ宣言でのみ有効ですか?私は "params"と呼ばれる関数本体の変数を作成しようとしていましたが、もちろんこれは大したことではありません。MSがそれをグローバルなキーワードにしてコンテキストにしない理由を疑問に思っています。paramsキーワードが文脈上でないのはなぜですか?

+3

なぜか分かりませんが、本当にこれを変数名として使用したい場合は、変数名を@:int @params = 1; – Derrick

答えて

5

tvanoffsonの答えは、「パラメータ」をコンテキストにすることは難しいと推測しています。それは実際にはそれほど難しくありません。次のように考えてみてください。

void M(params x) 

この場合、想定していることは、まず「params」タイプを見つけることです。私たちが見つけることができれば、素晴らしい、我々は完了です。もしできなければ、少し問題があります。たとえばxの代わりにxを指定したとします。

void M(params Int32) 

明らかにこれはエラーですが、どのようなエラーですか? Int32がパラメータ名であると仮定し、 "型がありません"というエラーを出すべきですか? Int32が型であると仮定し、型が配列型でなければならないというエラーを出し、識別子がないとしますか? 'params'という名前の型がないというエラーを返すべきですか?ここで正しいことは何ですか?われわれは明らかに何かを描くことができるが、明らかではない。

文脈上のキーワードでは厄介なエラーケースです。成功事例を正常に動作させることは、実際はかなり簡単です。

しかし、実際にはそれほど多くはありません。コンテキストにすることはコンテクストにするのは本当に大きな勝利ではありません。すべての人が "set"や "value"のような名前のローカル変数を作ろうとしていると仮定していたため、 "set"と "value"をコンテキストにすることは大きな勝利でした。 "params"は英語の単語でもないので、誰もそれを使いたくないようです。文脈的にすることに大きな利点はないので、機能のコストは正当化されません。

+0

ありがとうエリック。私は本当にあなたが念頭に置いていたことを読むことを望んでいました。私には、有効なケースは1のように思えます。利用できるparamsタイプはありますか? 2.そうでなければ、タイプ[]の形の型があり、識別子が続きます。私はあなたのような専門家ではありませんが、これがすべてのケースを網羅していると思いますか?また、あなたは正しいです、それは英語の単語ではなく、ちょうどパラメーター/(s)を書く代わりに、いくつかのコードで役に立つと思っただけです。 –

2

paramsキーワードはメソッドパラメータ宣言でのみ役立つように見えますが、とにかく、実際にはインスタンス名にキーワードを使用させるのは良い考えではありません。

params Customers = DB.GetCustomerList(); 

またはその他の同様のローカルスコープでparamsを許可:

おそらく彼らは、この中にC#8.0のようなものが持っている能力を確保しています。

+0

しかし、それはどうしますか?あなたが示したローカルスコープでそれを使用する私には、それほど意味がないでしょうか?私はわかりません。 BtwはいつC#8.0が出ていますか? :O –

+1

私のクリスタルボールが正確なら2017年頃だと思います。 –

+1

Joan - 良い質問です。私はそれが何をするか分かりません。実際には、私は文法エラーのためにC#8.0でコード行がコンパイルされるとは考えていません。 – Flipster

9

他のキーワードについても同様の質問があります。たとえば、クラス宣言でしか使用されないため、「クラス」はコンテキストに依存しないのはなぜですか?

私にはキーワードがキーワードです。私は、コンパイルの字句解析の部分を、そのコンテキストを認識する必要がなくて済むように大幅に簡素化すると思います。

var @params = new int[] { 1, 2 }; 
+0

ありがとうございますが、クラスが文脈的であった場合、ネストされたクラスの使い方をどのように分離しますか?しかし、paramsを使うと、他の場所を使うことはできません。それを区別するのは簡単なようですが、私はEric Lippertのようなコンパイラのマエストロではありません。 –

+0

私はあなたが典型的なクラス宣言構文を探すことによって 'クラス'文脈を作ることを試みることができると思う:[accessibility modifier] class [class name] {}。しかし、私はこれが実際に実現可能かどうかを知るためにコンパイラーの仕様に立っているわけではありません。 –

+0

わかりました。 –

4

エリックリペットはcontextual and reserved keywordsをカバーするブログ記事を持っており、その:さておき、あなたは「paramsは」(またはその他の予約キーワード)という変数を宣言することができるように@記号を使用することができるよう

歴史。 paramsが予約済みのリスト(1.0以降)にある理由を明示的に説明していませんが、それはとなる予約語のセットに属していることを意味します。

+0

ありがとう、予約語は何のためですか?私はそれが将来的に新しい潜在的な用途のために予約されていることを意味したと思った? –

+2

@ジョアン - 一部のものもありますが、ほとんどが「この目的のためだけに予約されています」のように予約されています。 – tvanfosson

関連する問題