Por experiencia anterior, tenía la impresión de que es perfectamente legal (aunque quizás no aconsejable) llamar a los métodos de extensión en una instancia nula. Así que en C#, este código se compila y se ejecuta:¿Por qué este método de extensión arroja una NullReferenceException en VB.NET?
// code in static class
static bool IsNull(this object obj) {
return obj == null;
}
// code elsewhere
object x = null;
bool exists = !x.IsNull();
Sin embargo, sólo estaba preparando una pequeña suite de código de ejemplo para los demás miembros de mi equipo de desarrollo (que sólo pasaron a .NET 3.5 y no tengo se le ha asignado la tarea de poner al equipo al día sobre algunas de las nuevas funciones disponibles para nosotros), y escribí lo que pensó que era el equivalente de VB.NET del código anterior, solo para descubrir que en realidad arroja un NullReferenceException
. El código que escribí fue el siguiente:
' 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()
El depurador se detiene justo allí, como si hubiera llamado a un método de instancia. ¿Estoy haciendo algo mal (por ejemplo, hay alguna diferencia sutil en la forma en que definí el método de extensión entre C# y VB.NET)? ¿Es realmente no legal llamar a un método de extensión en una instancia nula en VB.NET, aunque es legal en C#? (Hubiera pensado que esto era algo de .NET en lugar de algo específico del idioma, pero quizás estaba equivocado.)
¿Alguien me puede explicar esto?
es el método EsNulo sólo un ejemplo, o son lo que realmente desea utilizar x.IsNull() en lugar de 'x Is Nothing' o 'x == null'? – jrummell
@jrummell: Es solo un ejemplo. Como mencioné, estaba escribiendo un código de ejemplo para ilustrar cómo funcionan los métodos de extensión para algunos de los miembros de mi equipo. Me propuse que este método incluyera un comentario del tipo "En realidad, puedes hacerlo con métodos de extensión, aunque no lo recomendaría", solo para mostrar cómo bajo un sistema de extensión es realmente solo un elemento estático (Compartido).) método. Pero luego descubrí que * no * podía hacerlo en VB, lo que me sorprendió. –
Como se ha encontrado, esto se debe a la compatibilidad con el enlace tardío ... como usted (Dan). No me di cuenta de que VB tenía soporte para el enlace tardío, supongo que es una compatibilidad con VB6. Como un pequeño aparte, si está buscando establecer algunos estándares/entrenamiento para otros desarrolladores, quizás desee ordenar Option Strict ya que creo que ayuda a resolver muchos problemas potenciales. YMMV por supuesto. –