为什么在通用静态类中声明扩展方法是不可能的?

Hun*_*hpu 20 c# generics extension-methods static

我想为一些泛型类创建很多扩展方法,例如

public class SimpleLinkedList<T> where T:IComparable
Run Code Online (Sandbox Code Playgroud)

我已经开始创建这样的方法:

public static class LinkedListExtensions
{
    public static T[] ToArray<T>(this SimpleLinkedList<T> simpleLinkedList) where T:IComparable
    {
       //// code
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我试图使LinkedListExtensions类像这样通用时:

public static class LinkedListExtensions<T> where T:IComparable
{
    public static T[] ToArray(this SimpleLinkedList<T> simpleLinkedList)
    {
         ////code
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到"扩展方法只能在非泛型,非嵌套的静态类中声明".

而我正在试图猜测这种限制来自哪里并且没有任何想法.

编辑:仍然没有明确的问题愿景.似乎这只是因为某种原因没有实现.

Gor*_*pik 14

一般来说,由于在使用扩展方法时没有指定类,编译器无法知道哪个是定义扩展方法的类:

static class GenStatic<T>
{
  static void ExtMeth(this Class c) {/*...*/}
}

Class c = new Class();
c.ExtMeth(); // Equivalent to GenStatic<T>.ExtMeth(c); what is T?
Run Code Online (Sandbox Code Playgroud)

由于扩展方法本身可以是通用的,因此这根本不是真正的问题:

static class NonGenStatic
{
  static void GenExtMeth<T>(this Class c) {/*...*/}
}

Class c = newClass();
c.ExtMeth<Class2>(); // Equivalent to NonGenStatic.ExtMeth<Class2>(c); OK
Run Code Online (Sandbox Code Playgroud)

您可以轻松地重写您的示例,以便静态类不是通用的,但通用方法是.实际上,这就是.NET类Enumerable的编写方式.

  public static class LinkedListExtensions
  {
    public static T[] ToArray<T>(this SimpleLinkedList<T> where T:IComparable simpleLinkedList)
    {
      // code
    }
  }
Run Code Online (Sandbox Code Playgroud)


Ste*_*don 0

只是一个想法,但是有什么理由不能从此类派生并将额外的方法添加到专业化中,而不是编写一套扩展方法呢?我相信你有你的理由,但只是把它扔在那里。