Проблема в том, что документация не так ясна, как это должно быть.: - (
В частности, согласно:
http://www.ndesk.org/doc/ndesk-options/NDesk.Options/OptionValueType.html#F:NDesk.Options.OptionValueType.Required
=
в спецификации параметра не относится к OptionSet в целом, но толькодля значения для этой конкретной опции.
Важность этого действительно актуальна только в двух сценариях, поэтому сначала давайте рассмотрим анализатор OptionSet:
string a = null;
string b = null;
var options = new OptionSet {
{ "a=", v => a = v },
{ "b=", v => b = v },
};
Сценарий1, где важно то, что OptionSet.Parse () работает в однопроходном режиме только вперед и не просматривает значения параметров, чтобы определить, должны ли они быть "значениями". Таким образом, рассмотрим:
options.Parse(new[]{"-a", "-b"});
Результатом этого будет то, что a
имеет значение "-b"
, а b
равно null
. Поскольку для обработчика -a
требуется aзначение, оно всегда получает следующее значение (если только значение не «закодировано» в исходной опции, например, -a=value
).
Второе место, где это важно, это когда значениеПараметр -requiring является последним параметром, и для него нет значения:
options.Parse(new[]{"-a"});
Это вызовет исключение OptionException, так как обработчик для -a
требует значение, а значение отсутствует.
Следовательно, если у вас есть параметр, который сам необходим (какв отличие от опции, которая требует значения), вам нужно вручную проверить это:
string dir = null;
new OptionSet {
{ "o=", v => dir = v },
}.Parse (args);
if (dir == null)
throw new InvalidOperationException ("Missing required option -o=DIR");