3

我有点困惑为什么这不会出错。我在一些过时的遗留软件深处发现了这段代码,并惊讶地发现它可以工作。

public static string CleanFileName(this string fileName)
{
  return CleanFileName(fileName, 64);
}

public static string CleanFileName(this string fileName, int maxLength)
{
  //some logic
}

我对扩展方法的经验是这样称呼它:

fileName.CleanFileName(64);

这是否仅因为它也是静态方法而起作用?这是常见的做法,只是我还没有看到的东西,还是我应该用火杀死的过时的遗留代码?

4

2 回答 2

10

扩展方法总是可以选择调用,就好像“this”修饰符甚至不存在一样(也称为普通静态方法)。这样做不太可读,但在语法上是有效的。

另一个答案具有误导性,因为“它之所以有效,是因为方法调用是在与其重载相同的类型中进行的。” 暗示了一些关于扩展方法的东西。无论您碰巧在哪个类中,您都可以将扩展方法作为普通静态方法调用。但是通过下面的评论,听起来混淆是类是否需要限定。在这种情况下,内森是正确的,可以省略类名的原因是因为调用是在与重载相同的类中发生的。

于 2010-08-20T22:20:02.503 回答
6

它之所以有效,是因为调用CleanFileName(string, int)是在与 相同的类型中进行的CleanFileName(string),这允许以标准方法语法而不是扩展方法语法进行调用。因此,扩展方法前面不需要字符串实例前缀。

从语义上讲,static string Foo(this string foo, int bar) { }可以用Foo(string, int)or的形式调用string.Foo(int)

于 2010-08-20T22:17:47.143 回答