Cause
ToImmutable method was unnecessarily called on an immutable collection from System.Collections.Immutable namespace.
Rule description
System.Collections.Immutable namespace contains types that define immutable collections. This rule analyzes the following immutable collection types:
- System.Collections.Immutable.ImmutableArray
- System.Collections.Immutable.ImmutableList
- System.Collections.Immutable.ImmutableHashSet
- System.Collections.Immutable.ImmutableSortedSet
- System.Collections.Immutable.ImmutableDictionary
- System.Collections.Immutable.ImmutableSortedDictionary
These types define extension methods that create a new immutable collection from an existing System.Collections.Generic.IEnumerable collection.
- System.Collections.Immutable.ImmutableArray defines System.Collections.Immutable.ImmutableArray.ToImmutableArray.
- System.Collections.Immutable.ImmutableList defines System.Collections.Immutable.ImmutableList.ToImmutableList.
- System.Collections.Immutable.ImmutableHashSet defines System.Collections.Immutable.ImmutableHashSet.ToImmutableHashSet.
- System.Collections.Immutable.ImmutableSortedSet defines System.Collections.Immutable.ImmutableSortedSet.ToImmutableSortedSet.
- System.Collections.Immutable.ImmutableDictionary defines System.Collections.Immutable.ImmutableDictionary.ToImmutableDictionary.
- System.Collections.Immutable.ImmutableSortedDictionary defines System.Collections.Immutable.ImmutableSortedDictionary.ToImmutableSortedDictionary.
These extension methods are designed to convert a mutable collection to an immutable collection. However, the caller might accidentally pass in an immutable collection as input to these methods. This can represent a performance and/or a functional issue.
- Performance issue: Unnecessary boxing, unboxing, and/or runtime type checks on an immutable collection.
- Potential functional issue: Caller assumed to be operating on a mutable collection, when it actually had an immutable collection.
How to fix violations
To fix violations, remove the redundant ToImmutable call on an immutable collection. For example, the following two code snippets show a violation of the rule and how to fix them:
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
public class C
{
public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
{
// This is fine.
M2(collection.ToImmutableArray());
// This leads to CA2009.
M2(immutableArray.ToImmutableArray());
}
private void M2(ImmutableArray<int> immutableArray)
{
Console.WriteLine(immutableArray.Length);
}
}using System;
using System.Collections.Generic;
using System.Collections.Immutable;
public class C
{
public void M(IEnumerable<int> collection, ImmutableArray<int> immutableArray)
{
// This is fine.
M2(collection.ToImmutableArray());
// This is now fine.
M2(immutableArray);
}
private void M2(ImmutableArray<int> immutableArray)
{
Console.WriteLine(immutableArray.Length);
}
}When to suppress warnings
Do not suppress violations from this rule, unless you're not concerned about the performance impact from unnecessary allocations of immutable collections.
Suppress a warning
If you just want to suppress a single violation, add preprocessor directives to your source file to disable and then re-enable the rule.
#pragma warning disable CA2009
// The code that's violating the rule is on this line.
#pragma warning restore CA2009To disable the rule for a file, folder, or project, set its severity to none in the configuration file.
[*.{cs,vb}]
dotnet_diagnostic.CA2009.severity = noneFor more information, see How to suppress code analysis warnings.