忍者ブログ
おそらく活動状況とか、他愛もないこととか書きます。 μ崎みのりの気ままで気まぐれなブログです。 作曲とか、ゲーム製作なんかしてます。
[580]  [579]  [578]  [577]  [576]  [575]  [574]  [573]  [572
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

公式の仕様書に載ってる面白い記述について。

C#5.0で追加されたasync / await はコンテキストキーワードなので、
特定の部分以外では普通に識別子として使えます。
で、このうちasyncのほうはメソッド宣言の直前でのみキーワードになるため、
タイトルのようなメソッドを宣言してもエラーにならないというお話。

using async = System.Threading.Tasks.Task;
using await = System.Threading.Tasks.Task;

class Async
{
     async async async(async async) => await async;
     async await await(await await) => await @await;
}


不思議なことに(?)このコードは何のエラーもなくコンパイルできます。
色分けで大体どう解釈されてるか分かりますよね。
5つのasyncは左からキーワード、型、メソッド名、型、引数名と解釈されています。
残念ながらawaitを識別子に使う場合はメソッド内で引数を参照する際に@awaitと書く必要がありますが、それでも同じ単語が4種類の意味で使われているのは圧巻(?)ですね。

ちなみにasync / await の他だと、var・yieldや全てのクエリキーワード等がコンテキストキーワードなので、
yield return yield;
とか、
var from = from var in yield select var;
といった(無意味に読みにくい)記述が可能です。

ただし、これらの単語がコンテキストキーワードなのは飽くまでも互換性のためなので、
新しくコードを書く場合は識別子に使わないのが普通でしょうね。
PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
忍者ブログ [PR]