title: I'm getting `System.InvalidOperationException: Collection was modified; enumeration operation may not execute`, inexplicably
body: <p>I'm getting <code>System.InvalidOperationException: Collection was modified; enumeration operation may not execute</code>:</p>
  
  <pre><code>ExceptionLoggingLibrary.LoggingException: Exception of type 'ExceptionLoggingLibrary.LoggingException' was thrown. ---&gt; System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
  at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
  at iTextSharp.text.FontFactoryImp.GetFont(String fontname, String encoding, Boolean embedded, Single size, Int32 style, BaseColor color, Boolean cached)
  [...]
  </code></pre>
  
  <p>From what I understand, that exception happens when an IEnumerable object is modified during its enumeration.</p>
  
  <p>Here's the <code>iTextSharp.text.FontFactoryImp.GetFont</code> method:</p>
  
  <pre><code>    public virtual Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color, bool cached) {
          if (fontname == null) return new Font(Font.FontFamily.UNDEFINED, size, style, color);
          string lowercasefontname = fontname.ToLower(CultureInfo.InvariantCulture);
          List&lt;string&gt; tmp;
          fontFamilies.TryGetValue(lowercasefontname, out tmp);
          if (tmp != null) {
              // some bugs were fixed here by Daniel Marczisovszky
              int fs = Font.NORMAL;
              bool found = false;
              int s = style == Font.UNDEFINED ? Font.NORMAL : style;
              foreach (string f in tmp) {
                  string lcf = f.ToLower(CultureInfo.InvariantCulture);
                  fs = Font.NORMAL;
                  if (lcf.ToLower(CultureInfo.InvariantCulture).IndexOf("bold") != -1) fs |= Font.BOLD;
                  if (lcf.ToLower(CultureInfo.InvariantCulture).IndexOf("italic") != -1 || lcf.ToLower(CultureInfo.InvariantCulture).IndexOf("oblique") != -1) fs |= Font.ITALIC;
                  if ((s &amp; Font.BOLDITALIC) == fs) {
                      fontname = f;
                      found = true;
                      break;
                  }
              }
              if (style != Font.UNDEFINED &amp;&amp; found) {
                  style &amp;= ~fs;
              }
          }
          BaseFont basefont = null;
          try {
              try {
                  // the font is a type 1 font or CJK font
                  basefont = BaseFont.CreateFont(fontname, encoding, embedded, cached, null, null, true);
              }
              catch (DocumentException) {
              }
              if (basefont == null) {
                  // the font is a true type font or an unknown font
                  trueTypeFonts.TryGetValue(fontname.ToLower(CultureInfo.InvariantCulture), out fontname);
                  // the font is not registered as truetype font
                  if (fontname == null) return new Font(Font.FontFamily.UNDEFINED, size, style, color);
                  // the font is registered as truetype font
                  basefont = BaseFont.CreateFont(fontname, encoding, embedded, cached, null, null);
              }
          }
          catch (DocumentException de) {
              // this shouldn't happen
              throw de;
          }
          catch (System.IO.IOException) {
              // the font is registered as a true type font, but the path was wrong
              return new Font(Font.FontFamily.UNDEFINED, size, style, color);
          }
          catch {
              // null was entered as fontname and/or encoding
              return new Font(Font.FontFamily.UNDEFINED, size, style, color);
          }
          return new Font(basefont, size, style, color);
      }
  </code></pre>
  
  <p>Where in that method is it possible that an IEnumerable object is being modified during enumeration?</p>