Here are the main reasons why commented code is a code smell:

If some code must be conditionally compiled, then the preprocessor's #if should be used, as in:

#if DEBUG
  Console.WriteLine("Debug mode is activated!");
#endif

The following code snippet illustrates this rule:

using System;

class Program
{
  // This line is fine, but the following is not
  //int Id = 0;

  /*
  The following line is bad

  void Test() { int dirId = this.Id++; }

  No violation on the following line, because there is at most one violation per comment
  MyMethod();
  */

  static void Main(string[] args)
  {
  }
}