|
■No88997 (魔界の仮面弁士) に追記
>>frm.Invoke(MoziHai_dgl, TextHai)
たとえば下記なら、Invoke(MoziHai_dgl, TextHai) で呼び出せるのですけれどね。
Dim TextHai As IEnumerable(Of String) = New String(10) {}
Dim TextHai As Object = New String(10) {}
Dim TextHai As String()() = New String()() {New String(10) {}}
> Invoke メソッドの第 2 引数は、
> ByVal ParamArray args As Object()
> ですね。データ型に注意。
Invoke メソッドが ParamArray な定義である以上、
変数 TextHai が As Object() や As String() だと、
ParamArray に展開されて引数の数が変わってしまうという罠。
『Invoke(MoziHai_dgl, TextHai)』という呼び出しにするためには、
それ以外の型で無いと、やはり駄目なようです。
--------
Delegate Sub delegate_MoziHai(dummy As String, ByVal arg() As String) '引数 2 つのデリゲート
Private Sub BackGroundProcessSample()
Dim MoziHai_dgl As New delegate_MoziHai(AddressOf MoziHai)
Dim TextHai(10) As String
Me.Invoke(MoziHai_dgl, Nothing, TextHai) '引数 2 つを渡す:OK
End Sub
Private Sub MoziHai(dummy As String, ByVal arg As String())
End Sub
--------
Delegate Sub delegate_MoziHai(ByVal arg() As String) '引数 1 つのデリゲート
Private Sub BackgroundProcessSample()
Dim MoziHai_dgl As New delegate_MoziHai(AddressOf MoziHai)
Dim TextHai(10) As String
Me.Invoke(MoziHai_dgl, CObj(TextHai)) 'A:引数 1 つを渡す:OK
Me.Invoke(MoziHai_dgl, New Object(0) {TextHai}) 'B:引数 1 つを渡す:OK
Me.Invoke(MoziHai_dgl, New String()() {TextHai}) 'C:引数 1 つを渡す:OK
Me.Invoke(MoziHai_dgl, TextHai.AsEnumerable()) 'D:引数 1 つを渡す:OK
Me.Invoke(MoziHai_dgl, (Function(x) x)(TextHai)) 'E:引数 1 つを渡す:OK
'以下は実行時例外:TargetParameterCountException
'Me.Invoke(MoziHai_dgl, TextHai) 'ParamArray により引数 11 個として解釈される
'Me.Invoke(MoziHai_dgl, TextHai(0), TextHai(1), TextHai(2), _
' TextHai(3), TextHai(4), TextHai(5), TextHai(6), _
' TextHai(7), TextHai(8), TextHai(9), TextHai(10) _
') '自分で引数を分けるのは、なおさら NG
End Sub
Private Sub MoziHai(ByVal arg As String())
End Sub
--------
この制限があるがゆえに、VB では ParamArray な Delegate を
あえて禁止しているのかも知れない…。(C# は params な delegate を許容している)
|