« テレビ番組等感想 その 28 | トップページ | ただいま »

2007年8月14日 (火)

Re: Control.Invokeの書き方

コメントしようとしたらまたもや文字数制限に引っかかってしまったのでここに書く。Livedoor ブログってコメントの文字数制限がきつすぎるよなぁとか思いつつ。

基本的に、メソッドグループ (単なるメソッド名や匿名メソッド) からデリゲートへのキャストはデリゲートのコンストラクタ呼出しと等価です。

button1.Click += button1_Click;

が OK なのは、代入の際に暗黙の内に button1_Click が EventHandler にキャストされるからです。つまり、new EventHandler(...) が自動的に補われているということですね。

じゃあ何で

this.Invoke(delegate { label1.Text = "ほにゃらら"; });

がダメなのかというと、new Delegate(...) を補ってもコンパイルできないからです。

Invoke の引数の型は Delegate なのでコンパイラは new Delegate(...) を補いますが、Delegate クラスは abstract なので Delegate のコンストラクタを呼出すことはできないのです。

自分で MethodInvoker のコンストラクタを呼出しておく (MethodInvoker に明示的にキャストするのも同じ) とうまくいくのはおっしゃるとおりです。MethodInvoker が Delegate に暗黙的にキャストされるのは全く問題ないので。

|

« テレビ番組等感想 その 28 | トップページ | ただいま »

コメント

トラックバックどうもです。(^^/
new EventHandler(...) が自動的に補われるようになったのは、C#2.0からですね。これは僕も理解していました。
Invokeの場合は、自動的に、new Delegate(...) を補うけれど、abstractだからNoGoodというのも納得です。
MethodInvoker のコンストラクタを呼出せばOKというのは、僕が書いたとおりです。
でも、new とキャストは本質的にまったく別物なので、なぜ、キャストでOKなのかが、いまいち納得できないところです。

ちなみに、
this.Invoke(delegate { label1.Text = "ほにゃらら"; });
と書きたいってのは、Invokeメソッドへの不満ということで、こちらは、文法的な疑問ということでは無いです。

投稿: Gushwell | 2007年8月14日 (火) 18時57分

> なぜ、キャストでOKなのかが、いまいち納得できないところです。

あら、そうですか。私は全然違和感ないですけど……。

Invoke メソッドは引数の型が Delegate じゃなくて MethodInvoker だったら良かったのに、ということですね。(まぁ、引数 2 個のオーバーロードに型を合わせるのを優先した結果なんでしょうけど)

投稿: まじかんと | 2007年8月19日 (日) 12時08分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/169172/16110949

この記事へのトラックバック一覧です: Re: Control.Invokeの書き方:

« テレビ番組等感想 その 28 | トップページ | ただいま »