Reputation: 1223
Why does the following piece of code work?
call:
SomeObject sO = null;
bool test = sO.TestNull();
code:
public static bool TestNull(this SomeObject sO)
{
return sO == null;
}
Is this allowed to work or just a bug?
Upvotes: 6
Views: 298
Reputation: 6105
Assuming you meant
bool test = sO.TestNull();
Then the answer is just that static functions do not need an instance of the object. Also, calling an extension function is just syntactic sugar for calling the function with parameters.
edit:
I recommend also reading Jon Skeet's answer.
Upvotes: 6
Reputation: 3538
The code should be bool test = sO.TestNull();
. And yes, that is supposed to work.
You are extending an object with a function, it doesn't matter if the object is null
or contains a value. It's essentially the same as writing SomeStaticClass.TestNull(sO);
Upvotes: 4
Reputation: 22829
As Jon and others already pointed out, this is standard behaviour. It can be useful for
Long time ago I wondered whether it is OK to send messages to null references but time has shown that this is a pretty pragmatic and useful, especially considering the fact that in other languages null references simply do not exist.
Upvotes: 2
Reputation: 1499760
Is this allowed to work or just a bug?
The code after you've edited the question (to call s0.TestNull()
instead of null.TestNull()
is meant to work, yes.
Extension methods are just syntactic sugar for calling static methods as if they're instance methods. So a call of:
s0.TestNull()
is converted into
ClassContainingExtensionMethod.TestNull(s0)
... and that's all. No nullity checks are performed automatically.
This can actually be really useful - imagine if string.IsNullOrEmpty
had been an extension method - then instead of writing:
if (string.IsNullOrEmpty(foo))
you could write the more readable:
if (foo.IsNullOrEmpty())
However, this power should not be taken lightly - most extension methods should throw ArgumentNullException
if the first parameter has a null value, and those which don't should be very clear about it. (It should be relatively rare for such a method not to include Null
somewhere in the name.)
Upvotes: 13