Ошибка: метод расширения должен быть определен в неуниверсальном статическом классе - PullRequest
7 голосов
/ 19 ноября 2011

Я получаю следующую ошибку компиляции в имени класса.

Extension method must be defined in a non-generic static class

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

Ответы [ 6 ]

43 голосов
/ 19 ноября 2011

По запросу, вот мой комментарий в качестве ответа:

Без вашего кода мы мало что можем сделать.По-моему, вы случайно набрали «this» где-то в списке параметров.

5 голосов
/ 19 ноября 2011

Образец для метода расширения

public static class ExtensionMethods {
 public static object ToAnOtherObject(this object obj) {
  // Your operation here
 }
}
3 голосов
/ 09 мая 2013

У меня была такая же проблема, и я решил ее следующим образом.Мой код был примерно таким:

public static class ExtensionMethods 
{
    public static object ToAnOtherObject(this object obj) 
    {
        // Your operation here
    }
}

, и я изменил его на

public static class ExtensionMethods 
{
    public static object ToAnOtherObject(object obj) 
    {
        // Your operation here
    }
}

Я удалил слово «this» параметра метода.

1 голос
/ 19 ноября 2011

Полагаю, это относится к вашему предыдущему списку вопросов ; если да, то приведенный мною пример является методом расширения и будет:

public static class LinkedListUtils { // name doesn't matter, but must be
                                      // static and non-generic
    public static IEnumerable<T> Reverse<T>(this LinkedList<T> list) {...}
}

Этот служебный класс не обязательно должен совпадать с классом-потребителем, но методы расширения позволяют использовать его как list.Reverse()

Если вы не хотите использовать его как метод расширения, вы можете просто сделать его локальным статическим методом - просто уберите «this» из первого параметра:

public static IEnumerable<T> Reverse<T>(LinkedList<T> list) {...}

и использовать как:

foreach(var val in Reverse(list)) {...}
0 голосов
/ 19 ноября 2011

Как насчет размещения вашего кода? Методы расширения объявляются путем добавления первого параметра статического метода. Поскольку вы не будете использовать метод расширения, я подозреваю, что вы случайно запустили список параметров с this.

Ищите что-то вроде:

void Method(this SomeType name)
{
}
0 голосов
/ 19 ноября 2011

При создании метода расширения необходимо учитывать следующие моменты:

  1. Класс, определяющий метод расширения, должен быть неуниверсальным и static
  2. Каждый метод расширения должен быть static method
  3. Первый параметр метода расширения должен использовать ключевое слово this.
...