Как компилятор VB.NET выбирает, какую перегрузку расширения запускать?

Есть интересная странность - подумал, что кто-то может помочь.

Из этого вопроса получилось немного забавно с обнуляемыми типами:

Как проверить, является ли объект обнуляемым?

Option Strict On

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

  ' Call this overload 2
  
  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

Я ожидаю, что оба вызова IsNullable будут обрабатываться компилятором одинаково, но это не так. Вызов метода расширения использует другую перегрузку по сравнению с обычным вызовом метода, хотя аргумент «а» без изменений.

Мой вопрос почему? Что заставляет компилятор передумать между двумя вызовами?

FTR: мы используем Visual Studio 2010, .NET Framework 4.

Ответы на вопрос(2)

Ваш ответ на вопрос