IENumerable<T>.All() and List<T>.All() methods incorrectly assumed to be pure

The sample program below generates a pair of incorrect warnings on the All() method calls.  In both cases it is assuming the invocation is a pure method and the line of code is actually a no-op; but the collection is modified. 

 

This example came from a Stackoverflow question with 462k views, so I'm reasonably sure I'm not the only person who has seen the warning, looked at the code, and thought he could safely delete the line while wondering what the original author was trying to do.  This is cut down from actual code where the original data came from a `ToList()`ed LINQ query via EF6.

 

using System.Collections.Generic;
using System.Linq;
 
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            BlameStackoverflowForThis();
        }
 
        static void BlameStackoverflowForThis()
        {
            //https://stackoverflow.com/a/6233655/85661
            //the abuse of All() seen below is from the above answer
 
            List<TestObject> testList = new List<TestObject> { new TestObject(), new TestObject(), new TestObject() };
            IEnumerable<TestObject> testEnum = testList;
 
            //ReSharper warning:  Return value of pure method is not used
            //but text is changed from null to "foo"
            testEnum.All(c => { c.text = "foo"; return true; });             //ReSharper warning:  Return value of pure method is not used             //but text is changed from "foo" to "bar"            
//in this case testList.ForEach(c => { c.text = "bar"; }); is a              //clean way to do it,  but IEnumerable doesn't have a Foreach() method             testList.All(c => { c.text = "bar"; return true; });         }     }     public class TestObject     {         public  string text { get; set; }     } }
1 comment
Comment actions Permalink
Official comment

Hello Dan,

 

thank you for the provided feedback.

I've filed a correspondent issue in github tracker of our External Annotations package - https://github.com/JetBrains/ExternalAnnotations/issues/184

You can subscribe to the issue to get the latest updates on it.

Thank you.

Please sign in to leave a comment.