Вопреки распространенному мнению, дополнительные параметры действительно соответствуют 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 поддерживает это изначально, без каких-либо взломов. (В отличие от поддержки MSIL для ключевого слова Static в VB, что является еще одной темой.)
Итак, почему их нет в C #? Я не могу ответить на это, кроме моих предположений, что это может быть предполагаемое отсутствие спроса. Я всегда предпочитал указывать параметры, даже если они были необязательными - для меня код выглядит чище и его легче читать. (Если есть пропущенные параметры, я часто сначала ищу перегрузку, которая соответствует видимой подписи - только после того, как мне не удается найти ту, я понимаю, что задействованы дополнительные параметры.)