c# - 为什么不能在泛型静态类中声明扩展方法?

标签 c# generics static extension-methods

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

public class SimpleLinkedList<T> where T:IComparable

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

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

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

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

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

而且我试图猜测这个限制从何而来,却一无所知。

编辑:仍然对问题没有清晰的认识。似乎由于某种原因没有实现。

最佳答案

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

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?

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

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

Class c = newClass();
c.ExtMeth<Class2>(); // Equivalent to NonGenStatic.ExtMeth<Class2>(c); OK

您可以轻松重写您的示例,使静态类不是通用的,但通用方法是。事实上,Enumerable 等 .NET 类就是这样写的。

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

关于c# - 为什么不能在泛型静态类中声明扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2618271/

相关文章:

c# - 获取 403 禁止错误。客户端身份验证方案 'Anonymous' 禁止 HTTP 请求

c# - 更新语句与外键冲突

c# - 使用 C# 从 AB PLC 或任何其他 Controller 读取和写入数据

Java 泛型方法/参数类型

java - 通用回调 JavaFX 中没有推理

c# - 在 HTML.BeginForm MVC 5 中返回 List<Object>

java - 使用目的 ?泛型中的 super T 或 T super SomeClass

java - 线程是否创建静态变量的多个实例

java - 强制子类定义 protected 最终实例变量

java - 当线程处于特定 block 时,避免全局修改静态对象