You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
If an immutable class is being used for the command line options, and the constructor does not contain a match for the property name, a cryptic exception is thrown rather than a useful error message stating this fact. It would be very nice if there was an indication that the property has no matching ctor parameter. It took forever to realize that I had changed the property name from InputFile to IndexFile without changing the ctor parameter (and it looks close enough that I missed it.
Sample options class:
internal class CommandLineOptions
{
private const string DefaultInputFile = "";
private const string DefaultOutputFile = "-";
public CommandLineOptions(string inputFile = DefaultInputFile, string outputFile = DefaultOutputFile)
{
this.IndexFile = inputFile;
this.OutputFile = outputFile;
}
[Option('i', "index-xml", Required = false, Default = DefaultInputFile, HelpText = "The index file to use. If not specified, intput is read from stdin.")]
public string IndexFile { get; }
[Value(0, Required = false, Default = DefaultOutputFile, HelpText = "The output file to use. If not specified the output is written to stdout.")]
public string OutputFile { get; }
}
Cryptic exception:
Unhandled Exception: System.InvalidOperationException: Sequence contains no matching element
at System.Linq.Enumerable.First[TSource](IEnumerable`1 source, Func`2 predicate)
at CommandLine.Core.InstanceBuilder.<>c__DisplayClass2_0`1.<BuildImmutable>b__5(<>f__AnonymousType0`2 <>h__TransparentIdentifier0, SpecificationProperty sp)
at System.Linq.Enumerable.<SelectManyIterator>d__23`3.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at CommandLine.Core.InstanceBuilder.BuildImmutable[T](Type typeInfo, Maybe`1 factory, IEnumerable`1 specProps, IEnumerable`1 specPropsWithValue, List`1 setPropertyErrors)
at CommandLine.Core.InstanceBuilder.<>c__DisplayClass0_0`1.<Build>b__5()
at CommandLine.Core.InstanceBuilder.Build[T](Maybe`1 factory, Func`3 tokenizer, IEnumerable`1 arguments, StringComparer nameComparer, Boolean ignoreValueCase, CultureInfo parsingCulture, Boolean autoHelp, Boolean autoVersion, IEnumerable`1 nonFatalErrors)
at CommandLine.Parser.ParseArguments[T](IEnumerable`1 args)
at Converter.Program.TryGetCommandLineParameters(IEnumerable`1 args, CommandLineOptions& commandLineOptions) in Z:\Converter\Program.cs:line 66
at Converter.Program.Main(String[] args) in Z:\Converter\Program.cs:line 17
The text was updated successfully, but these errors were encountered:
If an immutable class is being used for the command line options, and the constructor does not contain a match for the property name, a cryptic exception is thrown rather than a useful error message stating this fact. It would be very nice if there was an indication that the property has no matching ctor parameter. It took forever to realize that I had changed the property name from InputFile to IndexFile without changing the ctor parameter (and it looks close enough that I missed it.
Sample options class:
Cryptic exception:
The text was updated successfully, but these errors were encountered: