«Необязательные» параметры являются просто синтаксическим сахаром: когда ваш код компилируется в IL, значение этого необязательного параметра по умолчанию явно вставляется во все места, где явное значение не указано. Следовательно, при генерации собственного IL, который вызывает метод с необязательными параметрами, вам необходимо указать значение этих параметров.
Это легко продемонстрировать с помощью приведенного ниже кода:
class Program
{
static void Main(string[] args)
{
TestOptional();
TestOptional(1);
TestOptional(42);
Console.ReadKey();
}
private static void TestOptional(int? opt = 1)
{
Console.WriteLine(opt);
}
}
Если вы скомпилируете этот код и посмотрите его разборку с помощью декомпилятора, например ILSpy , вы увидите, что фактический код, сгенерированный компилятором, выглядит следующим образом:
TestOptional(1); // note that the "optional" parameter value has been substituted
TestOptional(1);
TestOptional(42);
Помимо: самый простой способ «отладки», почему ваше поколение IL не работает, - это написать и скомпилировать ожидаемый код, а затем использовать декомпилятор для просмотра того, что испустил компилятор.