Dall'esperienza precedente avevo avuto l'impressione che fosse perfettamente legale (anche se forse non consigliabile) chiamare i metodi di estensione su un'istanza nulla. Quindi, in C#, questo codice viene compilato ed eseguito:Perché questo metodo di estensione genera una NullReferenceException in VB.NET?
// code in static class
static bool IsNull(this object obj) {
return obj == null;
}
// code elsewhere
object x = null;
bool exists = !x.IsNull();
Tuttavia, stavo solo mettendo insieme una piccola suite di codice di esempio per gli altri membri del mio team di sviluppo (siamo appena trasferiti in .NET 3.5 e ho stato assegnato il compito di ottenere il team su alcune delle nuove funzionalità a nostra disposizione), e ho scritto quello che ho pensato era l'equivalente VB.NET del codice sopra, solo per scoprire che in realtà getta un NullReferenceException
. Il codice che ho scritto era questo:
' code in module '
<Extension()> _
Function IsNull(ByVal obj As Object) As Boolean
Return obj Is Nothing
End Function
' code elsewhere '
Dim exampleObject As Object = Nothing
Dim exists As Boolean = Not exampleObject.IsNull()
Il debugger si ferma proprio lì, come se avessi chiamato un metodo di istanza. Sto facendo qualcosa di sbagliato (ad esempio, c'è una sottile differenza nel modo in cui ho definito il metodo di estensione tra C# e VB.NET)? È in realtà non legale legale chiamare un metodo di estensione su un'istanza null in VB.NET, sebbene sia legale in C#? (Avrei pensato che si trattasse di una cosa .NET rispetto a una cosa specifica della lingua, ma forse mi sbagliavo.)
Qualcuno può spiegarmelo?
è il metodo IsNull solo un esempio o sono si fa effettivamente desidera utilizzare x.IsNull() invece di 'x Is Nothing' o 'x == null'? – jrummell
@jrummell: è solo un esempio. Come ho detto, stavo scrivendo un codice di esempio per illustrare come funzionano i metodi di estensione per alcuni membri del mio team. Intendevo che questo metodo includesse un commento sulla falsariga di "In realtà puoi farlo con i metodi di estensione, anche se non lo consiglierei" - solo per mostrare come sotto un cappuccio un metodo di estensione sia in realtà solo una statica) metodo. Ma poi ho scoperto che non potevo * farlo in VB, il che mi ha sorpreso. –
Come è stato rilevato, questo è dovuto al supporto per l'associazione tardiva ... come te (Dan) Non mi rendevo conto che VB aveva tale supporto per l'associazione tardiva, suppongo che sia una compatibilità con VB6. Per fare un po 'di attenzione, se stai cercando di definire alcuni standard/formazione per altri sviluppatori potresti voler imporre Option Strict perché ritengo che aiuti a raccogliere molti potenziali problemi. YMMV naturalmente. –