2014年7月13日

オーバーロードの比較

比較といっても大きな違いは 1 つだけ。
C# は同じ型の引数でも、値渡しと参照渡し(ref または out)で別々のメソッドとして定義できるが、VB は不可。

具体的には、C# で次はコンパイル可。

public class TestOverloadCs
{
    public static void Action(int value)
    {
        Console.WriteLine("Action(int)");
    }
    public static void Action(ref int value)
    {
        Console.WriteLine("Action(ref int)");
    }
}

VB で次はコンパイル不可。

Public Class TestOverloadVb
    Public Shared Sub Action(ByVal value As Integer) 'コンパイルエラー
        Console.WriteLine("Action(int)")
    End Sub

    Public Shared Sub Action(ByRef value As Integer)
        Console.WriteLine("Action(ref int)")
    End Sub
End Class

VB は呼び出し側で ref とか out とかのキーワードを付けないから、上記のようなオーバーロードは禁止されているのだと思われる。

また、上記の C# のオーバーロードは、VB から普通に呼べないので注意。
VB_OverloadMethodCallError
リフレクションを使うとたぶん呼べる。

VB で使用するライブラリを C# で書く場合、上記のようなオーバーロードは避けるのが無難。
C# と VB のちゃんぽんはオススメしないが・・・

参考URL

0 件のコメント:

コメントを投稿