Добавление общих методов расширения к интерфейсам, таким как IEnumerable - PullRequest
6 голосов
/ 21 июня 2011

Я пытался заставить мои общие методы расширения работать, но они просто отказываются, и я не могу понять , почему . Эта тема мне не помогла, хотя и должна.

Конечно, я посмотрел, как, везде, где я вижу, говорят, что это просто и должно быть в этом синтаксисе:
(В некоторых местах я читал, что мне нужно добавить «где T: [тип]» после объявления параметра, но мой 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>

выдает эту ошибку:

Метод расширения должен быть определен в неуниверсальный статический класс

Любая помощь будет высоко ценится, я действительно застрял здесь.

Ответы [ 3 ]

14 голосов
/ 21 июня 2011

Я думаю, что вам не хватает сделать методы универсальными в 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 голос
/ 21 июня 2011

Попробуйте:

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());
  }
}
0 голосов
/ 21 июня 2011

Вы на самом деле не создали универсальные методы, вы объявили неуниверсальные методы, которые возвращают List<T> без определения 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());
        }
    }
...