Mam ciekawe osobliwości - myślałem, że ktoś może ci pomóc.W jaki sposób kompilator VB.NET wybiera, które rozszerzenie przeciążenia należy uruchomić?
Ten wyszedł trochę zabawy z pustych typów z tym pytanie:
How to check if an object is nullable?
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
chciałbym oczekiwać, że oba połączenia z IsNullable byłyby traktowane tak samo przez kompilator, ale to nie jest walizka. Wywołanie metody extension używa innego przeciążenia do normalnego wywołania metody, mimo że argument "a" pozostaje niezmieniony.
Moje pytanie brzmi: dlaczego? Co sprawia, że kompilator zmienia zdanie między tymi dwoma wywołaniami?
FTR: Jesteśmy przy użyciu Visual Studio 2010, .NET Framework 4.
Twoje pytanie nie jest jasne „Można by pomyśleć, oba połączenia do IsNullable w podpunktach testowym skutkowałoby tym samym przeciążenia są używane, rzeczywiście każdy z nich użyj innego. " –
Punkt zaczerpnięty Dodałem komentarze do mojego kodu. Mam nadzieję, że to wyjaśnia. –