8

Здравствуйте. Требуется включить в проект Visual Studion 2015 Community исходный код из проекта MoreLinq. Попытался запустить sulution и скомпилировать проекты, но проекты даже не загрузились, возникает следующая ошибка:

C:\Users\rostov.d\Desktop\MoreLINQ-master\MoreLinq\MoreLinq.csproj : error : пространством имен XML по умолчанию для этого проекта должно быть пространством имен MSBuild XML. Если проект создан в формате MSBuild 2003, добавьте xmlns="http://schemas.microsoft.com/developer/msbuild/2003" в элемент . Если проект был создан в старом формате 1.0 или 1.2, преобразуйте его в формат MSBuild 2003. C:\Users\rostov.d\Desktop\MoreLINQ-master\MoreLinq\MoreLinq.csproj

Попытался скопировать только нужные файлы исходного кода в свой проект и скомпилировать. Но Visual Studio ругается на конструкции такого типа:

return _(); IEnumerable<T> _()

Подозреваю, что это связано с отложенным выполнением Linq запросов. В интернете документации найти не смог. Что это за конструкция "return"_(); и как скомпилировать такой код под Visual Stuio 2015 Community? Пример функции с таким return:

public static IEnumerable<T> Exclude<T>(this IEnumerable<T> sequence, int startIndex, int count)
{
    if (sequence == null) throw new ArgumentNullException(nameof(sequence));
    if (startIndex < 0) throw new ArgumentOutOfRangeException(nameof(startIndex));
    if (count < 0) throw new ArgumentOutOfRangeException(nameof(count));

    return _(); IEnumerable<T> _()
    {
        var index = -1;
        var endIndex = startIndex + count;
        using (var iter = sequence.GetEnumerator())
        {
            // yield the first part of the sequence
            while (iter.MoveNext() && ++index < startIndex)
                yield return iter.Current;
            // skip the next part (up to count items)
            while (++index < endIndex && iter.MoveNext())
                continue;
            // yield the remainder of the sequence
            while (iter.MoveNext())
                yield return iter.Current;
        }
    }
}
Qwertiy
  • 123,725
RostovDA
  • 505
  • О, прикольно, новые фичи. Наоборот, эта штука новее, чем VS2015. И использована оригинально. Вроде бы должно быть можно поставить какой-то nuget-пакет для поддержки нового шарпа. – Qwertiy Jun 09 '17 at 09:26
  • nuget наверное надо установить – Anatol Jun 09 '17 at 09:26
  • На самом деле это всего лишь вложенный метод, просто форматирование поплыло ) И да, нужен C# 7, а соответственно VS2017 – Андрей NOP Jun 09 '17 at 09:29
  • @Андрей, C#7 можно как-то компилировать в VS2015... – Qwertiy Jun 09 '17 at 09:30
  • Наверное - да, надо просто компилятор свежий подключить, думаю... – Андрей NOP Jun 09 '17 at 09:31
  • @Андрей, nuget-пакет есть для этого, кажется. – Qwertiy Jun 09 '17 at 09:31
  • @Андрей https://ru.stackoverflow.com/a/670066/235242 то же самое касается и C#7 для 15 вижлы – MihailPw Jun 09 '17 at 09:31
  • Возможный дубликат вопроса: Ошибка с интерполяцией – MihailPw Jun 09 '17 at 09:32
  • Как вариант, можно установить чуть более старую версию пакета, как видно по коммитам в Git, поддержка фич C#7 была добавлена сравнительно недавно – Андрей NOP Jun 09 '17 at 09:37
  • 1
    @AGS17, не дубликат, т. к. версия шарпа не та. – Qwertiy Jun 09 '17 at 09:42

1 Answers1

10

Тут используется объявление вложенного метода:

IEnumerable<T> _()

Это просто метод без параметров, который имеет имя _ и возвращает IEnumerable<T>.

return _();

А тут возвращается результат вызова этого метода.

Из-за использования yield return метод не начнёт выполняться до того, как произойдёт обращение к первому элементу возвращаемой последовательности. Однако, автор хотел, чтобы секция валидации входных данных

if (sequence == null) throw new ArgumentNullException(nameof(sequence));
if (startIndex < 0) throw new ArgumentOutOfRangeException(nameof(startIndex));
if (count < 0) throw new ArgumentOutOfRangeException(nameof(count));

исполнялась немедленно, поэжтому она должна находиться в методе, не содержащем yield return. Т. о. весь метод распадается на два.

И немного ссылок:

Qwertiy
  • 123,725