¿Cómo elige el compilador VB.NET qué sobrecarga de extensión ejecutar?
Tengo una curiosidad interesante: pensé que alguien podría ayudar.
Esto salió de alguna diversión con tipos anulables de esta pregunta:
¿Cómo comprobar si un objeto es anulable?
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
Yo esperaría que ambas llamadas a IsNullable fueran tratadas de la misma manera por el compilador, pero ese no es el caso. La llamada al método de extensión usa una sobrecarga diferente a la llamada al método normal, aunque el argumento "a" no se haya modificado.
Mi pregunta es ¿por qué? ¿Qué hace que el compilador cambie de opinión entre las dos llamadas?
FTR: Estamos utilizando Visual Studio 2010, .NET Framework 4.