一般に信じられていることとは反対に、オプションのパラメーターは CLS に準拠しているように見えます。(ただし、これに対する私の主なチェックは、アセンブリ、クラス、およびメソッドをすべて CLSCompliant 属性でマークし、True に設定することでした。)
では、これは MSIL ではどのように見えるのでしょうか?
.method public static int32 MyMethod(int32 param1,
[opt] int32 param2,
[opt] int32 param3) cil managed
{
.custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = ( 01 00 01 00 00 )
.param [2] = int32(0x00000000)
.param [3] = int32(0x00000001)
// Code size 11 (0xb)
.maxstack 2
.locals init ([0] int32 MyMethod)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: add.ovf
IL_0004: ldarg.2
IL_0005: add.ovf
IL_0006: stloc.0
IL_0007: br.s IL_0009
IL_0009: ldloc.0
IL_000a: ret
} // end of method Module1::MyMethod
パラメーターの [opt] マークに注意してください。MSIL はこれをハックなしでネイティブにサポートしています。(VB の Static キーワードに対する MSIL のサポートとは異なり、これはまったく別のトピックです。)
では、なぜこれらが C# にないのでしょうか。需要が不足していると推測されるという私の推測を除いて、私はそれに答えることができません. 私自身の好みは、パラメーターがオプションであっても、常にパラメーターを指定することでした。私にとっては、コードがよりきれいに見え、読みやすくなっています。(省略されたパラメーターがある場合、私は最初に目に見える署名に一致するオーバーロードを探すことがよくあります。オプションのパラメーターが含まれていることに気付くのは、見つけられなかった後でのみです。)