<p>Why must <code>Type.Equals(t1, t2)</code> be used to determine equivalent types, and not the equality operator (e.g. for VB.NET, <code>t1 = t2</code>)? </p>

<p>It seems inconsistent with other parts of the .NET API.</p>

<p>Example in VB.NET:</p>

<p><code>If GetType(String) = GetType(String) Then 
    Debug.Print("The same, of course")
End If</code></p>

<p>causes a compile-time error of "<code>Operator '=' is not defined for types 'System.Type' and 'System.Type'.</code>"</p>

Given the way types are loaded, that surprises me. Where did you hear this from?
The
docs for System.Type.Equals(Type)
suggest that it's comparing via the
UnderlyingSystemType
property, but I'm not sure under what circumstances two different Type objects would have the same underlying system type.
I'd be really interested to see an example where this mattered... my
guess
is that from anywhere in "user code" they'll be the same thing, but there may be some cunning BCL code where it matters.