commandline
commandline copied to clipboard
"InvalidOperationException: appears to be Immutable with invalid constructor" when suppling invalid (throwable) args
Description
When calling constructor with single string, if the constructor throws - the result of parsing is also throwing (misleading) exception instead of returning error lambda.
Minimal reproducable code:
using System;
using System.Globalization;
using CommandLine;
class Program
{
[Verb("test")]
public class Options
{
private CultureInfo _localization;
[Option('l', "lang", Required = true, Default = "en")]
public CultureInfo Localization => _localization;
public Options(CultureInfo localization)
{
_localization = localization;
}
}
static void Main(string[] args)
{
var types = new Type[] { typeof(Options) };
var result = Parser.Default.ParseArguments(args, types);
result
.WithParsed(obj => {})
.WithNotParsed(errs => {});
}
}
Call with: test -l "FooBar"
Expected behaviour
The WithNotParsed lambda should be called with error message pointing to invalid argument
Actual behaviour
The line with var result = Parser.Default.ParseArguments(args, types); throws:
System.InvalidOperationException: 'Type Program+Options appears to be Immutable with invalid constructor. Check that constructor arguments have the same name and order of their underlying Type. Constructor Parameters can be ordered as: '(localization)''
Additional info:
When called with test -l "en-US" the code will correctly enter WithParsed lambda.
Version data:
- Tested on Windows / .NET Framework 4.7.2
- Tested on version 2.8.0 from NuGet of CommandLineParser
This appears to continue to be an issue in v2.9.1 (.NET Framework 4.8). Is this likely to be fixed?
This issue still exists, for the options class "appears to be immutable, but no constructor found to accept values." I recently migrated from .net6 to .net8, this issue was not present in .net6, only popped up since updating to .net8. Any chance we could get some insight? I'd prefer not to create a constructor for the options class (is cleaner without, and worker in .net6). Thanks!