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