C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

文字列配列を引数としてInvokeする方法

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■88990 / inTopicNo.1)  文字列配列を引数としてInvokeする方法
  
□投稿者/ でんき (1回)-(2018/10/24(Wed) 14:13:51)

分類:[.NET 全般] 

VB.NETを使っていて、
文字列配列を引数としてInvokeしたいのですが
以下のようにやっても、パラメータカウントが一致しない、というエラーが出てうまくいきません、

一体、どのようにすれば良いでしょうか?


Sub BackGroundProcess()

                Dim TextHai(10) As String

                frm.Invoke(MoziHai_dgl, TextHai)


End Sub


    Delegate Sub delegate_MoziHai(ByVal Text_hai0$())

    Public MoziHai_dgl As New delegate_MoziHai(AddressOf MoziHai)

    Public Sub MoziHai(ByVal Text_hai0$())


    End Sub



引用返信 編集キー/
■88991 / inTopicNo.2)  Re[1]: 文字列配列を引数としてInvokeする方法
□投稿者/ shu (1146回)-(2018/10/24(Wed) 14:33:54)
No88990 (でんき さん) に返信
>
> frm.Invoke(MoziHai_dgl, TextHai)
>
CObj(TextHai)
でどうでしょう?
引用返信 編集キー/
■88993 / inTopicNo.3)  Re[2]: 文字列配列を引数としてInvokeする方法
□投稿者/ でんき (2回)-(2018/10/24(Wed) 14:42:24)
うまくいきました。
まさかと思ったのですが
オブジェクト形式か引数として使用できないのでしょうか?

これって何となく形式変換せずに使いたいのですが
Invokeで配列を使うにはこれが普通なのでしょうか?

引用返信 編集キー/
■88997 / inTopicNo.4)  Re[3]: 文字列配列を引数としてInvokeする方法
□投稿者/ 魔界の仮面弁士 (1891回)-(2018/10/24(Wed) 16:18:32)
No88990 (でんき さん) に返信
> Sub BackGroundProcess()
バックグランドプロセスの中で、frm や MoziHai_dgl などといった
非ローカル変数にアクセスしている点が少し気になりました。


> Delegate Sub delegate_MoziHai(ByVal Text_hai0$())
型宣言文字 $ が使われていますが、要するにこの引数は、
ByVal As String() な型となるわけですよね。文字列型の一次元配列。


> Dim TextHai(10) As String
これも As String() ですね。


> frm.Invoke(MoziHai_dgl, TextHai)
Invoke メソッドの第 2 引数は、
 ByVal ParamArray args As Object()
ですね。データ型に注意。



No88993 (でんき さん) に返信
> オブジェクト形式か引数として使用できないのでしょうか?
使用できますが、そのまま渡した場合と CObj してから渡した場合とでは意味が変わります。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=67028&KLOG=113

Option Strict On
Module Module1
  Sub Main()
    Dim TextHai(10) As String
    Test(CObj(TextHai))  'これは「1」「Object()」「String()」
    Test(TextHai)     'これは「11」「String()」「Nothing」
  End Sub

  Sub Test(ByVal ParamArray args() As Object)
    Console.WriteLine(args.Length)
    Console.WriteLine(TypeName(args))
    Console.WriteLine(TypeName(args(0)))
  End Sub
End Module
引用返信 編集キー/
■88998 / inTopicNo.5)  Re[3]: 文字列配列を引数としてInvokeする方法
□投稿者/ shu (1147回)-(2018/10/24(Wed) 16:19:23)
No88993 (でんき さん) に返信

配列を渡したい場合はObjectにする必要があります。
Invokeの定義が
Invoke(method As Delegate, ParamArray args() as Object)
であるので
提示されたコードだと
args = TextHai
になってしまうので
args(0) = TextHai(0)
args(1) = TextHai(1)
・・・
args(10) = TextHai(10)
となり引数11個のmethodとして扱われてしまいます。

args = {TextHai}
とならなければならないのでTextHaiをObjectにして1つの
インスタンスとして認識させる必要があります。


引用返信 編集キー/
■88999 / inTopicNo.6)  Re[4]: 文字列配列を引数としてInvokeする方法
□投稿者/ 魔界の仮面弁士 (1892回)-(2018/10/24(Wed) 18:15:22)
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 を許容している)

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ