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)