Never mutate state in a Debug.Assert call


Yesterday I encountered a bug in a library I'm working on that only seemed to occur when compiled in release mode. I was scratching my head for a little while but suddenly it occured to me when I encountered the following line:

Debug.Assert(reader.Read() == '-'); // Consume token

The problem with the above statement is that calls to Debug.Assert are conditional, so when running under a non-debug build, the call won't be made and the expression won't be evaluated.

So what lessons can we learn from this?

Never mutate state in a Debug.Assert call.