commandline icon indicating copy to clipboard operation
commandline copied to clipboard

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

Open Shelim opened this issue 4 years ago • 2 comments

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

Shelim avatar Feb 01 '21 10:02 Shelim

This appears to continue to be an issue in v2.9.1 (.NET Framework 4.8). Is this likely to be fixed?

lassanter avatar May 22 '24 18:05 lassanter

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!

ndbills avatar May 09 '25 03:05 ndbills