我想为一些泛型类创建很多扩展方法,例如对于
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/