佐々木屋

技術的なことから趣味まで色々書きます

オプション引数②

オプション引数がC#で長らく導入されてこなった詳しい経緯は不明ですが、私が想像するに「オーバーロードと機能がかぶるから」が一番の理由かなーと思っています。

オプション引数とオーバーロードを組み合わせてしまうと、当然挙動が分かりにくくなりますのでおすすめしませんが、あえてどういう挙動になるかだけ説明しておきます。

オーバーロードの優先順位は以下の通りです。
 オプション引数無し → オプション引数あり → 可変長引数

private void test(int a, int b, int c = 4) {
    Console.WriteLine("オプション引数あり");
}
private void test(int a, int b) {
    Console.WriteLine("オプション引数なし");
}
private void test(params int[] a) {
    Console.WriteLine("可変長引数");
}

test(1, 2);
test(1, 2, 3);
test(1, 2, 3, 4, 5, 6);
Private Sub test(ByVal a As Integer, ByVal b As Integer, Optional ByVal c As Integer = 4)
    Console.WriteLine("オプション引数あり")
End Sub
Private Sub test(ByVal a As Integer, ByVal b As Integer)
    Console.WriteLine("オプション引数なし")
End Sub
Private Sub test(ParamArray c As Integer())
    Console.WriteLine("可変長引数")
End Sub

test(1, 2)
test(1, 2, 3)
test(1, 2, 3, 4, 5, 6)
オプション引数なし
オプション引数あり
可変長引数