commandlineparser / commandlineparser/commandline

"InvalidOperationException: appears to be Immutable with invalid constructor" when suppling invalid (throwable) args

Open
#734 3 comments 10 reactions 0 assignees View on GitHub
Dominant language
C#
Stars
4.8k
Forks
478
PR merge metrics
No merged PRs in 30d

Description

# 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:

````csharp
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

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.