Actually, I'll mutate if you don't mind
After I had changed all my extension methods to be functions and return a new object rather than mutating the self parameter, I changed them all back to be refs. Why? Well mainly because the library I am writing is in VB, and these methods are internal. VB supports ByRef parameters as the first param in an extension method, so no problems there. The only reason I was changing them so that they were C# compatible was so that I could test them with MSpec in C#....