0

刚才我读到了扩展方法。我在静态类中创建了静态方法,它工作正常。

    static class ExtensionMethods
    {
        public static string splitFirstName(this string strName)
        {
            return strName.Split(" ".ToCharArray())[0];
        }
     }

但是如果我在非静态类中创建静态方法,它就不起作用。

    class NonStaticCls
    {
      public static string splitFirstName(this string strName)
      {
        return strName.Split(" ".ToCharArray())[0];
      }
    }

请告诉为什么它不能在非静态类中工作。

4

5 回答 5

6

请告诉为什么它不能在非静态类中工作。

因为这就是扩展方法的指定方式。它们必须在非嵌套、非泛型类中声明。

从 C# 5 规范的第 10.6.9 节:

当方法的第一个参数包含 this 修饰符时,该方法称为扩展方法。扩展方法只能在非泛型、非嵌套的静态类中声明。扩展方法的第一个参数不能有除此以外的修饰符,参数类型不能是指针类型。

为什么在非静态类中声明它?您想要实现哪些使用静态类无法实现的目标?(我几乎可以想象一些可能性,但它们不是我自己想在扩展方法中做的事情......)

于 2013-08-16T06:28:24.940 回答
3

类是 的要求static。这是合理的。如果它不是静态类,您将能够(可能)创建该类的实例。但是它有扩展方法,可能用于其他完全不相关的类。这可能非常令人困惑。

于 2013-08-16T06:28:39.163 回答
2

这是设计行为。扩展方法只能在静态类中声明。

如何:实现和调用自定义扩展方法(C# 编程指南)

定义和调用扩展方法

  1. 定义一个静态类来包含扩展方法。
于 2013-08-16T06:28:14.553 回答
2

看起来是设计使然。

来自MSDN

以下列表提供了静态类的主要功能:

  • 仅包含静态成员。

  • 无法实例化。

  • 被密封。

  • 不能包含实例构造函数。

看看 Eric Lippert 的这个答案

同样来自AskJonSkeet

它在语言规范中规定,C# 4 规范的第 10.6.9 节:

当方法的第一个参数包含 this 修饰符时,该方法称为扩展方法。扩展方法只能在非泛型、非嵌套的静态类中声明。扩展方法的第一个参数不能有除此以外的修饰符,参数类型不能是指针类型。

于 2013-08-16T06:29:13.827 回答
1

根据 C# 规范。你可以在这里阅读更多扩展方法

扩展方法只能在非泛型、非嵌套的静态类中声明。

正如其他人指出的那样,您需要包括静态。

基本上你会创建一堆扩展方法作为实用项目或助手类

  1. 创建静态类不需要实例化,直接调用方法。例如。Math.Pow()
  2. 根据您的问题,扩展方法仅在静态类中有效。并使用适当的命名空间。
于 2013-08-16T06:30:13.423 回答