问题
I've been trying and trying to make my generic extension methods work, but they just refuse to and I can't figure out why. This thread didn't help me, although it should.
Of course I've looked up how to, everywhere I see they say it's simple and it should be in this syntax:
(On some places I read that I need to add "where T: [type]" after the parameter decleration, but my VS2010 just says that's a syntax error.)
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());
    }
}
But that just doesn't work, I get this error:
The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)
If I then replace
public static class TExtensions
by
public static class TExtensions<T>
it gives this error:
Extension method must be defined in a non-generic static class
Any help will be much appreciated, I'm really stuck here.
回答1:
I think what you're missing is making the methods generic in 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());
}
Note the <T> after the name of each method, before the parameter list. That says it's a generic method with a single type parameter, T.
回答2:
Try:
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());
  }
}
回答3:
You have not actually created generic methods you have declared non geeneric methods that return List<T> without defining T.  You need to change as below:
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());
        }
    }
来源:https://stackoverflow.com/questions/6423152/adding-generic-extension-methods-to-interfaces-like-ienumerable