title: Why doesn't Dictionary<TKey, TValue> support null key?
body: <p>Firstly, <em>why</em> doesn't <code>Dictionary&lt;TKey, TValue&gt;</code> support a single null key?</p>
  
  <p>Secondly, is there an existing dictionary-like collection that does?</p>
  
  <p>I want to store an "empty" or "missing" or "default" <code>System.Type</code>, thought <code>null</code> would work well for this.</p>
  
  <hr>
  
  <p>More specifically, I've written this class:</p>
  
  <pre><code>class Switch
  {
      private Dictionary&lt;Type, Action&lt;object&gt;&gt; _dict;
  
      public Switch(params KeyValuePair&lt;Type, Action&lt;object&gt;&gt;[] cases)
      {
          _dict = new Dictionary&lt;Type, Action&lt;object&gt;&gt;(cases.Length);
          foreach (var entry in cases)
              _dict.Add(entry.Key, entry.Value);
      }
  
      public void Execute(object obj)
      {
          var type = obj.GetType();
          if (_dict.ContainsKey(type))
              _dict[type](obj);
      }
  
      public static void Execute(object obj, params KeyValuePair&lt;Type, Action&lt;object&gt;&gt;[] cases)
      {
          var type = obj.GetType();
  
          foreach (var entry in cases)
          {
              if (entry.Key == null || type.IsAssignableFrom(entry.Key))
              {
                  entry.Value(obj);
                  break;
              }
          }
      }
  
      public static KeyValuePair&lt;Type, Action&lt;object&gt;&gt; Case&lt;T&gt;(Action action)
      {
          return new KeyValuePair&lt;Type, Action&lt;object&gt;&gt;(typeof(T), x =&gt; action());
      }
  
      public static KeyValuePair&lt;Type, Action&lt;object&gt;&gt; Case&lt;T&gt;(Action&lt;T&gt; action)
      {
          return new KeyValuePair&lt;Type, Action&lt;object&gt;&gt;(typeof(T), x =&gt; action((T)x));
      }
  
      public static KeyValuePair&lt;Type, Action&lt;object&gt;&gt; Default(Action action)
      {
          return new KeyValuePair&lt;Type, Action&lt;object&gt;&gt;(null, x =&gt; action());
      }
  }
  </code></pre>
  
  <p>For switching on types. There are two ways to use it:</p>
  
  <ol>
  <li>Statically. Just call <code>Switch.Execute(yourObject, Switch.Case&lt;YourType&gt;(x =&gt; x.Action()))</code></li>
  <li>Precompiled. Create a switch, and then use it later with <code>switchInstance.Execute(yourObject)</code></li>
  </ol>
  
  <p>Works great <em>except</em> when you try to add a default case to the "precompiled" version (null argument exception).</p>