Из предыдущего опыта у меня создалось впечатление, что он совершенно легален (хотя, возможно, и нецелесообразно), ссылаться на методы расширения на нулевом экземпляре. Итак, в С# этот код компилируется и запускается:
// 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()
Отладчик останавливается прямо там, как если бы я вызвал метод экземпляра. Я что-то делаю неправильно (например, есть ли какая-то тонкая разница в том, как я определил метод расширения между С# и VB.NET)? Действительно ли это не законно для вызова метода расширения для нулевого экземпляра в VB.NET, хотя он является законным в С#? (Я бы подумал, что это была вещь .NET, а не язык, но, возможно, я был не прав.)
Может кто-нибудь объяснить это мне?