我一直在尝试让我的通用扩展方法正常工作,但他们只是拒绝,我无法弄清楚为什么。 This thread didn't help me, although it should.
当然我已经查到了如何,在我看到他们说它很简单的任何地方,它应该是这个语法:
(在某些地方我读到我需要在参数解除后添加“where T:[type]”,但我的VS2010只是说这是语法错误。)
using System.Collections.Generic;
using System.ComponentModel;
public static class TExtensions
{
public static List<T> ToList(this IEnumerable<T> collection)
{
return new List<T>(collection);
}
public static BindingList<T> ToBindingList(this IEnumerable<T> collection)
{
return new BindingList<T>(collection.ToList());
}
}
但是这不起作用,我得到了这个错误:
类型或命名空间名称'T'可以 找不到(你错过了使用 指令或程序集引用?)
如果我再替换
public static class TExtensions
通过
public static class TExtensions<T>
它给出了这个错误:
扩展方法必须在a中定义 非通用静态类
任何帮助将不胜感激,我真的被困在这里。
答案 0 :(得分:14)
我认为你所缺少的是在T
中使方法变得通用:
public static List<T> ToList<T>(this IEnumerable<T> collection)
{
return new List<T>(collection);
}
public static BindingList<T> ToBindingList<T>(this IEnumerable<T> collection)
{
return new BindingList<T>(collection.ToList());
}
请注意参数列表前面每个方法名称后面的<T>
。这说明它是一个带有单一类型参数的通用方法T
。
答案 1 :(得分:1)
尝试:
public static class TExtensions
{
public static List<T> ToList<T>(this IEnumerable<T> collection)
{
return new List<T>(collection);
}
public static BindingList<T> ToBindingList<T>(this IEnumerable<T> collection)
{
return new BindingList<T>(collection.ToList());
}
}
答案 2 :(得分:0)
您实际上没有创建声明非常规方法的泛型方法,这些方法在不定义T的情况下返回List<T>
。您需要更改如下:
public static class TExtensions
{
public static List<T> ToList<T>(this IEnumerable<T> collection)
{
return new List<T>(collection);
}
public static BindingList<T> ToBindingList<T>(this IEnumerable<T> collection)
{
return new BindingList<T>(collection.ToList());
}
}