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.