Entgegen der landläufigen Meinung scheinen optionale Parameter CLS-konform zu sein. (Allerdings habe ich dies in erster Linie dadurch überprüft, dass ich die Assembly, die Klasse und die Methode mit dem Attribut CLSCompliant markiert habe, das auf True gesetzt ist).
Wie sieht das nun in MSIL aus?
.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
Beachten Sie die [opt]-Markierungen an den Parametern - MSIL unterstützt dies von Haus aus, ohne irgendwelche Hacks. (Im Gegensatz zu MSILs Unterstützung für das VB-Schlüsselwort Static, was ein ganz anderes Thema ist).
Warum also sind diese nicht in C#? Darauf kann ich keine Antwort geben, außer meiner Vermutung, dass es vielleicht an der mangelnden Nachfrage liegt. Ich selbst habe es immer vorgezogen, die Parameter anzugeben, auch wenn sie optional sind - für mich sieht der Code sauberer aus und ist leichter zu lesen. (Wenn Parameter weggelassen werden, suche ich oft zuerst nach einer Überladung, die der sichtbaren Signatur entspricht - erst wenn ich keine finde, wird mir klar, dass es sich um optionale Parameter handelt).