質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

2309閲覧

VBでAction型への追加記述方法

退会済みユーザー

退会済みユーザー

総合スコア0

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/06/16 04:58

前提・実現したいこと

VB.Netで以下C#のようにAction型に追加(+=)を行いたいです
以下VBのように記載すると+=の行で
「演算子 '+' は、型 'Action' および 'Sub <generated method>()' に対して定義されていません。」
と怒られてしまいます。
どのように記述すればよろしいでしょうか?

C#

1private void Button1_Click(object sender, EventArgs e) 2{ 3 Action xxx; 4 xxx = () => Console.WriteLine("aaa"); 5 xxx += () => Console.WriteLine("bbb"); 6 7 xxx(); 8}

VB

1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 2 3 Dim xxx As Action 4 xxx = Sub() Console.WriteLine("aaa") 5 ' ここがエラー 6 xxx += Sub() Console.WriteLine("bbb") 7 8 xxx() 9 10End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

提示されたC#コードをコンパイルすると下記のC#コードと等価となるようです。

C#

1private void Button1_Click(object sender, EventArgs e) 2{ 3 Action xxx; 4 xxx = new Action(() => Console.WriteLine("aaa")); 5 xxx = (Action)System.Delegate.Combine(xxx, new Action(() => Console.WriteLine("bbb"))); 6 7 xxx(); 8} 9

なので、VBでは下記のように書くことができます。

VB

1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 2 3 Dim xxx As Action 4 xxx = New Action(Sub() Console.WriteLine("aaa")) 5 xxx = DirectCast(System.Delegate.Combine(xxx, New Action(Sub() Console.WriteLine("bbb"))), Action) 6 7 xxx() 8 9End Sub

投稿2019/06/16 06:26

evin101

総合スコア92

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/16 07:18

情報ありがとうございます。 私もやってみました。確かに等価になりますね。 コンパイル後のC#をVBに変換するとエラーの出ないVBコードに変換されたので C#・VB変換がうまくいかないときは一度コンパイルしてから変換してみるのも手なのですね
guest

0

ベストアンサー

C# では演算子のオーバーロードを使い、+= に Delegate.Combine メソッドを割り当てています。
これをほどいて VB で記述すると次のようになります。

VB.NET

1Sub Main() 2 Dim action As Action 3 action = Sub() Console.WriteLine("Hello") 4 action = Action.Combine(action, CType(Sub() Console.WriteLine("World"), Action)) 5 action() 6 Console.ReadKey() 7End Sub

+= を使えるようにするには、次のリンクを参照して演算子をオーバーロードしてください。

自作クラスの演算子をオーバーロードする

追記

Delegate の演算子をオーバーロードするのは無理そうです。
C# のオーバーロードはライブラリレベルではなく言語レベルでやっていそうです。「いそう」というのは、詳しく調査していないからですが、少なくともソースにはありませんでした。

投稿2019/06/16 05:51

編集2019/06/16 06:12
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/16 06:43

ご回答ありがとうございます。 教えていただい方法でやりたいことができました。 ありがとうございます。 >Delegate の演算子をオーバーロードするのは無理そうです。 私も色々やってみたのですがうまくいかなくて追加で質問するか 考えていました。。。 難しそうということで承知しました。
guest

0

変換ツールがあるので使ってみてはいかがですか?

TeleRick Code Converter
http://converter.telerik.com/

試しに、上記のサイトのツールで変換してみると、以下のようになります。動くかどうかは試してませんが。

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Dim xxx As Action xxx = Function() Console.WriteLine("aaa") xxx += Function() Console.WriteLine("bbb") xxx() End Sub

投稿2019/06/16 05:06

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/16 05:14

すいません言葉足らずでした。 そのサイト使って変換してみました。 結果、仰る通りになるのですが まず「Function() Console.WriteLine("aaa")」の時点で怒られます 返り値がないのにFunction()はおかしいということで、そこをSubに変更しました。 それでもまだ怒られるので、お伺いした次第です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問