Методы расширения Linq недоступны в немедленном окне Visual Studio 2015

#c# #visual-studio #linq #visual-studio-2015

#c# #visual-studio #linq #visual-studio-2015

Вопрос:

ошибка CS1061: ‘ICollection<>’ не содержит определения для ‘SelectMany’ и не удалось найти метод расширения ‘SelectMany’, принимающий первый аргумент типа ‘ICollection<>’ (вам не хватает директивы using или ссылки на сборку?)

Visual Studio 2015 поддерживает вычисление лямбда-выражений linq в режиме отладки в немедленном окне. Я протестировал его с помощью консольного приложения, в котором я извлекаю Process.GetProcesses() , перехожу к немедленному окну и начинаю писать .Select или .Where на нем. Все работает нормально.

Однако я не могу сделать то же самое в своем проекте.

Моя точка останова находится в этой строке:

 return Dimensions.Values.SelectMany(dimension => dimension.Attributes)
                        .FirstOrDefault(dimensionAttribute => key.Equals(dimensionAttribute.Key));
 

Выполнение F10 работает. Однако, когда я пытаюсь запустить это же выражение по частям, в немедленном окне, т.е. Dimensions.Values.SelectMany(dimension => dimension.Attributes) Я получаю вышеупомянутую ошибку.

Я пытаюсь неправильно оценить это? Чего мне не хватает?

Комментарии:

1. Просто чтобы быть уверенным.. Вы уверены, что у вас есть using Systen.Linq ?

2. Используете ли вы System.Linq?

3. @GiladGreen, @mww, да, я использую System.Linq . Я должен сказать вам, что это снаружи namespace {} и поверх него. Я упомянул об этом, потому что хотел явно указать, что его нет внутри namespace {} . Кроме того, работает F10.

4. попробуйте включить System.Data.Entity ссылку на dll в свой проект, возможно, это решит вашу проблему!

5. Странно, это работает сегодня!! Не уверен в прерывистом поведении.

Ответ №1:

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

 Enumerable.FirstOrDefault(Enumerable.SelectMany(Dimensions.Values, dimension => dimension.Attributes),dimensionAttribute => key.Equals(dimensionAttribute.Key));
 

Комментарии:

1. Черт возьми, это потрясающе и хакерски. Мне это нравится.

2. Спасибо @Lennart, это работает! Мне нужно было что-то подобное для немедленной цели, я могу пройти немного дольше. Но я не могу принять это как ответ на конкретный вопрос, который я задал. Причина, по которой мы используем методы расширения, заключается в том, что мы можем связать их в цепочку. Было ли так, что он должен был работать в немедленном окне vs 2015?

3. @singsuyash Имейте в виду, что вы можете вызывать разные методы расширения. Реальным кодом может быть an IQueryable<T> , который имеет другие методы расширения.