为什么下面这段代码可以工作?
调用:
SomeObject sO = null;
bool test = sO.TestNull();
代码:
public static bool TestNull(this SomeObject sO)
{
return sO == null;
}
这是允许工作还是只是一个错误?
最佳答案
Is this allowed to work or just a bug?
编辑问题后的代码(调用 s0.TestNull()
而不是 null.TestNull()
应该可以工作,是的。
扩展方法只是调用静态方法的语法糖,就好像它们是实例方法一样。所以调用:
s0.TestNull()
转化为
ClassContainingExtensionMethod.TestNull(s0)
...仅此而已。不会自动执行任何无效检查。
这实际上非常有用 - 想象一下 string.IsNullOrEmpty
一直是一种扩展方法 - 然后而不是写作:
if (string.IsNullOrEmpty(foo))
你可以写出更具可读性的:</p>
if (foo.IsNullOrEmpty())
但是,不应掉以轻心 - 大多数扩展方法应该在第一个参数具有空值时抛出 ArgumentNullException
,而那些不应该是非常对此很清楚。 (这种方法不在名称某处包含Null
应该是比较少见的。)
关于c# - 可以在无对象上调用扩展方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20266723/