Como o compilador VB.NET escolhe qual sobrecarga de extensão será executada?

Tem uma esquisitice interessante - achei que alguém poderia ajudar.

Isso saiu de alguma diversão com tipos anuláveis ​​dessa questão:

Como verificar se um objeto é anulável?

Option Strict On

Module Test
  ' Call this overload 1
  <Extension()>
  Function IsNullable(obj As ValueType) As Boolean
    Return False
  End Function

  ' Call this overload 2
  <Extension()>
  Function IsNullable(Of T As {Structure})(obj As Nullable(Of T)) As Boolean
    Return True
  End Function

  Sub Test() 
    ' a is an integer!
    Dim a As Integer = 123

    ' calling IsNullable as an extension method calls overload 1 and returns false
    Dim result1 As Boolean = a.IsNullable()

    ' calling IsNullable as method calls overload 2 and returns true
    Dim result2 As Boolean = IsNullable(a)

    ' why? surely the compiler should treat both those calls as equivalent
  End Sub
End Module

Eu esperaria que ambas as chamadas para IsNullable fossem tratadas da mesma forma pelo compilador, mas esse não é o caso. A chamada de método de extensão usa uma sobrecarga diferente para a chamada de método normal, embora o argumento "a" não seja alterado.

Minha pergunta é por que? O que faz o compilador mudar de idéia entre as duas chamadas?

FTR: Estamos usando o Visual Studio 2010, o .NET Framework 4.

questionAnswers(2)

yourAnswerToTheQuestion