C# 选项:如何正确注册所需参数?

C# 选项:如何正确注册所需参数?,c#,.net,command-line,command-line-arguments,C#,.net,Command Line,Command Line Arguments,我试图通过以下方式使用OptionSet类: string resultsFileName = null; bool isHelp = false; var p = new OptionSet() { { "r=|resultsFile=", "The file with the results", v => { resultsFileName = v; } } { "h|help", "Show this help", v => { isHelp =

我试图通过以下方式使用
OptionSet
类:

  string resultsFileName = null;
  bool isHelp = false;

  var p = new OptionSet() {
    { "r=|resultsFile=",  "The file with the results", v => { resultsFileName = v; } }
    { "h|help", "Show this help", v => { isHelp = (v != null); } },
  };

  try
  {
    p.Parse(args);
  }
  catch (OptionException e)
  {
    Console.WriteLine("Invalid arguments: " + e.Message);
    ShowHelp(p);
    return;
  }
因此,预计需要
resultsFile
选项(根据文档:)。但是,当我按原样运行程序时(即没有命令行参数),不会引发异常。请帮忙

更新:在调试器中,当没有提供命令行选项时,将永远无法使用
私有void AssertValid(int index)
方法来抛出新的OptionException这是的副本,并且:NDesk.options不支持该选项

引用我自己的话:

根据文档,选项规范中的
=
不适用于OptionSet作为一个整体,而仅适用于该特定选项的值

<>这很重要,它只在两个场景中相关,所以首先让我们考虑OpTySSET解析器:

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=value

第二个重要的地方是,当需要价值的选项是最后一个选项,并且没有为其提供价值时:

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");
谢谢你的快速回答!(不过,有点小意思的是,该功能不受支持,因为它有助于命令行参数验证的健壮性)。