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

标签 c# extension-methods

为什么下面这段代码可以工作?

调用:

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/

相关文章:

c# - 当为 null 或 Count = 0 时序列化 List<T> 属性

ios - 在 Swift 中使用 Bool 的 View Controller 扩展

c#-3.0 - 什么时候使用扩展方法是一个好习惯?

c# - 显式使用扩展方法

c# - 从 C# 调用 PHP Web 服务

c# - MessageSecurityException 没有为具有 'http://...' 操作的消息指定签名消息部分

asp.net-mvc - 在我的情况下使用扩展方法是否正确?

dart - 在Dart语言中使用实验性扩展方法时的类型推断

c# - 动态与强类型元素

c# - 如何使用 .NET 拆分一个字符串并包含分隔符?