Из предыдущего опыта у меня сложилось впечатление, что вполне законно (хотя, возможно, и не желательно) вызывать методы расширения для нулевого экземпляра. Итак, в C # этот код компилируется и запускается:
// code in static class
static bool IsNull(this object obj) {
return obj == null;
}
// code elsewhere
object x = null;
bool exists = !x.IsNull();
Однако я просто собирал небольшой набор примеров кода для других членов моей команды разработчиков (мы только что перешли на .NET 3.5, и мне было поручено ускорить работу группы над некоторыми из новые функции, доступные нам), и я написал то, что я думал, что был VB.NET-эквивалентом вышеупомянутого кода, только чтобы обнаружить, что он действительно выдает NullReferenceException
. Код, который я написал, был таким:
' 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()
Отладчик останавливается тут же, как если бы я вызвал метод экземпляра. Я делаю что-то не так (например, есть ли небольшая разница в способе определения метода расширения между C # и VB.NET)? Действительно ли не законно вызывать метод расширения для нулевого экземпляра в VB.NET, хотя это допустимо в C #? (Я бы подумал, что это вещь .NET, в отличие от языка, но, возможно, я ошибался.)
Кто-нибудь может мне это объяснить?