расширение, которое создает исключение StackOverflow - PullRequest
1 голос
/ 15 февраля 2011

Я написал расширение функции для класса.Эта функция расширения возвращает IList в качестве результата.В большинстве случаев я хотел бы преобразовать IList в массив T [].Это требует от меня объявить "using System.Linq;"в каждом классе, который преобразует IList в T [].Таким образом, чтобы сохранить для меня объявление "using System.Linq;"Я написал расширение в том же классе моего исходного расширения (так что мне не пришлось бы объявлять «using»):

    public static T[] ToArray<T>(this IList<T> list)
    {
        return list.ToArray();
    }

Конечно, у класса extenssion есть «using System.Linq;»,но это единственное место, где мне нужно поставить эту декларацию.Проблема в том, что я получаю исключение StackOverflow, так как команда "list.ToArray ();"фактически вызывает рекурсивно для себя, а не для исходного ToArray.Я могу изменить имя функции - MakeArray вместо ToArray, но я хотел бы сохранить свои соглашения об именах.Может быть, у вас есть какие-либо решения?

1 Ответ

9 голосов
/ 15 февраля 2011

Во-первых, я настоятельно советую вам , а не , чтобы сделать это. Вы «сохранили» одну строку (одну директиву using) и добавили четыре строки, которые не работают. Почему директива с одним пользователем так болезненна для вас? Это не относится к остальной части кода и почти полностью безвредно ... и, конечно, предоставляет вам все другие преимущества LINQ.

Если вы действительно должны сделать это, вы можете просто явно вызвать версию LINQ:

public static T[] ToArray<T>(this IList<T> list)
{
    return System.Linq.Enumerable.ToArray(list);
}

Но просто не .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...