Passing a collection as an argument to the collection’s own method is a code defect. Doing so might either have unexpected side effects or always have the same result.
Another case is using set-like operations. For example, using Union between a list and itself will always return the same list. Conversely, using Except between a list and itself will always return an empty list.
Exceptions to this rule are the methods AddRange and Concat, since the developer can use them to
multiply the list elements or the list itself respectively.
var list = new List<int>(); list.Union(list); // Noncompliant: always returns list list.Intersect(list); // Noncompliant: always returns list list.Except(list); // Noncompliant: always returns empty list.SequenceEqual(list); // Noncompliant: always returns true var set = new HashSet<int>(); set.UnionWith(set); // Noncompliant: no changes set.IntersectWith(set); // Noncompliant: no changes set.ExceptWith(set); // Noncompliant: always returns empty set.SymmetricExceptWith(set); // Noncompliant: always returns empty set.IsProperSubsetOf(set); // Noncompliant: always returns false set.IsProperSupersetOf(set); // Noncompliant: always returns false set.IsSubsetOf(set); // Noncompliant: always returns true set.IsSupersetOf(set); // Noncompliant: always returns true set.Overlaps(set); // Noncompliant: always returns true set.SetEquals(set); // Noncompliant: always returns true list.AddRange(list); // Compliant list.Concat(list); // Compliant