Skip to content

Command class violates design rule CA1010 #2751

@smdn

Description

@smdn

Summary

The System.CommandLine.Command class implements non-generic IEnumerable, but it does not implement IEnumerable<T>.

public class Command : Symbol, IEnumerable

This causes classes inheriting from the Command class to violate design rule CA1010.
For projects with AnalysisMode set to Recommended or All, warning CA1010 will occur.

Build succeeded.

/home/smdn/temp/cli/Lib.cs(5,14): warning CA1010: Type 'MyCommand' directly or indirectly inherits 'IEnumerable' without implementing 'IEnumerable<T>'. Publicly-visible types should implement the generic version to broaden usability. (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1010) [/home/smdn/temp/cli/cli.csproj]
    1 Warning(s)
    0 Error(s)

This simply triggers a warning and does not corrupt any functionality of System.CommandLine.
However, since the cause of the warning is not easy to find out and it may cause confusion, so I think this should be fixed.

Steps to reproduce

Set AnalysisMode to Recommended or All in the csproj file.

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>

    <!-- Enable design rules including CA1010 -->
    <AnalysisMode>Recommended</AnalysisMode>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.CommandLine" Version="2.0.1" />
  </ItemGroup>

</Project>

Create a class that inherits from the Command class.

using System.CommandLine;

namespace MyLibrary;

// warning CA1010: Type 'MyCommand' directly or indirectly inherits 'IEnumerable' without implementing 'IEnumerable<T>'. Publicly-visible types should implement the generic version to broaden usability. (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1010)
public class MyCommand(string name, string? description) : Command(name, description) { }

Workarounds

The following workarounds are available to avoid this warning.

Workaround 1: disable warning CA1010

#pragma warning disable CA1010
public class MyCommand(string name, string? description) : Command(name, description)
{
}
#pragma warning restore CA1010

Workaround 2: implement IEnumerator<Symbol>

public class MyCommand(string name, string? description) : Command(name, description)
{
    // Implement IEnumerator<Symbol> in order to suppress warning CA1010.
    public IEnumerator<Symbol> GetEnumerator() => Children.GetEnumerator();
}

Workaround 3: reduce AnalysisMode

    <!-- Reduce `AnalysisMode` to either `None`, `Default`, or `Minimum`. -->
    <AnalysisMode>Minimum</AnalysisMode>

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions