可以在无对象上调用扩展方法吗?

Off*_*ler 6 c# extension-methods

为什么以下代码有效?

呼叫:

SomeObject sO = null;
bool test = sO.TestNull();
Run Code Online (Sandbox Code Playgroud)

码:

public static bool TestNull(this SomeObject sO)
{
    return sO == null;
}
Run Code Online (Sandbox Code Playgroud)

这是允许工作还是只是一个错误?

Jon*_*eet 13

这是允许工作还是只是一个错误?

编辑问题后的代码(打电话s0.TestNull()而不是null.TestNull()打算工作,是的.

扩展方法只是用于调用静态方法的语法糖,就好像它们是实例方法一样.所以打电话给:

s0.TestNull()
Run Code Online (Sandbox Code Playgroud)

转换成

ClassContainingExtensionMethod.TestNull(s0)
Run Code Online (Sandbox Code Playgroud)

... 就这样.不会自动执行无效检查.

这实际上可能非常有用 - 想象一下是否string.IsNullOrEmpty是一个扩展方法 - 然后而不是写:

if (string.IsNullOrEmpty(foo))
Run Code Online (Sandbox Code Playgroud)

你可以写得更可读:

if (foo.IsNullOrEmpty())
Run Code Online (Sandbox Code Playgroud)

但是,不应该掉以轻心 - 大多数扩展方法应该抛出ArgumentNullException第一个参数的空值,而不应该非常清楚.(这种方法应该包含Null在名称的某处,这应该是相对罕见的.)


Dav*_* S. 6

假设你的意思

bool test = sO.TestNull();
Run Code Online (Sandbox Code Playgroud)

那么答案就是静态函数不需要对象的实例.此外,调用扩展函数只是用于使用参数调用函数的语法糖.

编辑:

我还建议你阅读Jon Skeet的回答.