Как правило, то, что вы хотите, невозможно. Вы можете подделать его с «недействительным» значением по умолчанию, как показывает ответ Ани, но это не работает, если нет значения, которое вы можете считать недействительным. Это не будет проблемой для типов значений, где вы можете изменить параметр на обнуляемый тип, но тогда вы будете подвергаться боксу, а также «разбавлять» интерфейс функции только для учета деталей реализации.
Вы можете достичь желаемой функциональности, если заменить необязательный параметр парадигмой множественных перегрузок до C # 4:
public void doSomething()
{
var settings = // get your settings here any way you like
this.doSomething(settings);
}
public void doSomething(SettingsClass settings)
{
// implementation
}
Это работает, даже если параметр является типом значения.