title: Why does ((IList<T>)array).ReadOnly = True but ((IList)array).ReadOnly = False?
body: <p>I know that in .NET all arrays derive from System.Array and that the System.Array class implements <code>IList</code>, <code>ICollection</code> and <code>IEnumerable</code>. Actual array types also implement <code>IList&lt;T&gt;</code>, <code>ICollection&lt;T&gt;</code> and <code>IEnumerable&lt;T&gt;</code>.</p>
  
  <p>This means that if you have, for example, a <code>String[]</code>, then that <code>String[]</code> object is also a <code>System.Collections.IList</code> and a <code>System.Collections.Generic.IList&lt;String&gt;</code>;.</p>
  
  <p>It's not hard to see why those IList's would be considered "ReadOnly", but surprisingly...</p>
  
  <pre><code>String[] array = new String[0];
  Console.WriteLine(((IList&lt;String&gt;)array).IsReadOnly); // True
  Console.WriteLine(((IList)array).IsReadOnly); // False!
  </code></pre>
  
  <p>In both cases, attempts to remove items via the <code>Remove()</code> and <code>RemoveAt()</code> methods results in a NotSupportedException.  This would suggest that both expressions correspond to ReadOnly lists, but IList's <code>ReadOnly</code> property does not return the expected value.</p>
  
  <p>How come?</p>