Получил интересную странность - думал, что кто-то может помочь.
Это вызвало некоторую забаву с нулевыми типами из этого вопроса:
Как проверить, является ли объект допустимым?
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
Я ожидал бы, что оба вызова IsNullable будут обработаны одним и тем же компилятором, но это не так. Вызов метода расширения использует другую перегрузку для вызова нормального метода, даже если аргумент "a" не изменяется.
Мой вопрос - почему? Что заставляет компилятор передумать между двумя вызовами?
FTR: Мы используем Visual Studio 2010,.NET Framework 4.
