commandlineparser / commandlineparser/commandline

Options with mixed required and optional incompatible with nullable reference types

未關閉
#435 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
主要語言
C#
星號
4.8k
分支
478
PR 合併指標
30 天內沒有已合併 PR

描述

[Nullable reference types](https://docs.microsoft.com/dotnet/csharp/nullable-references) is a great new feature to help mitigate `NullReferenceExceptions` in production; however, when declaring options classes with both required and optional parameters, are incompatible.

Imagine an options class like so:
```csharp
public class GetOptions
{
[Option("path", Required = true)]
public string Path { get; set; }

[Option("out")]
public string? Out { get; set; }
}
```

This would satisfy CommandLine, but not the C# compiler with nullable types enabled because `Path` has to be set by the constructor. The compiler errs. We could add a `?` to the `string` declaration, but then we are effectively breaking the intent of declaring that `Path` will never be null downstream.

So we refactor the class like so:
```csharp
public class GetOptions
{
public GetOptions(string path)
{
Path = path ?? throw new ArgumentNullException(nameof(path));
}

[Option("path", Required = true)]
public string Path { get; }

[Option("out")]
public string? Out { get; set; }
}
```

However, because the options class type is still mutable, the constructor is not used and instead a default constructor is required.

I propose a model that allows both. And because this could be considered a breaking change (though perhaps not in practice), this could be opt-in: perhaps a marker interface for options classes or some other configuration. This would override the `IsMutable` check in `InstanceBuilder` and allow for non-default construction and property setters.

We also want to use this in a project that targets net45, and are willing to contribute changes that not only enable this behavior but also add back support for net45. Or perhaps you wouldn't mind a revision on 2.3.0 which we use now.

貢獻指南

這個儲存庫沒有索引到貢獻指南

評估

這個 Issue 還沒有評估資料。

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。