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 に暗黙的にキャストされるのは全く問題ないので。
| 固定リンク
コメント
トラックバックどうもです。(^^/
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分