普段Visual Basicを使っていると、C#が持っている匿名メソッドやyieldが使えたらと考えることもあり、Visual Studio 2008ではVisual Basicのラムダ式の制限が多く、さらに差を付けられているように感じます。そこでプロジェクトの一部をC#に変換してみることにしました。
小さなサンプルコードであればWeb上にオンライン変換の機能を提供してくれているサイトがあるのでそれを利用しますが、まとまったコード量だと正確に変換してくれないと手修正が大変になります。ツールの選定はいろいろな情報を探したなかでInstant C#(カナダからダウンロード販売)が良いと判断しました。
Visual BasicにあってC#にない機能や問題になりそうなところを事前に書き直しました。また実際に変換してみた結果問題があったところも含めて以下の項目を変更しておくと良いようです。
WithEvents
とHandles
句をAddHandler
,RemoveHandler
に書き換えておくWith
文の後にコンストラクタや関数を記述しているものは、一時変数を定義してWith
の直前で代入しておく、With
文は残しておいても問題ない- 省略可能な引数を定義しているメソッドはオーバーロードに書き換えておく(Instant C#では自動変換できる)
- メソッド内のスタティック変数をクラスレベルに出しておく
- メソッド呼び出しで名前付き引数は通常の引数リストに書き換えておく
以上の事前準備を行ってから変換してみたのですが、コンパイルができる状態にはなりませんでした。Instant C#のバグもありましたし、言語仕様の違いから自動変換は不可能だろうと思えるところ(例えばインタフェースの明示的実装など)もありました。バグ対応はしてくれるようなので修正されたもので再度試すつもりです。