2012-01-13 3 views
12

я задаю вопрос, потому что всякий раз, когда я пытаюсь вызвать метод расширения из Немедленное окна в Visual Studio 2010, я получаю следующее сообщение об ошибке:Может Методы расширения вызываются из Immediate Window

System.Collections.Generic.IEnumerable' does not contain a definition for 'ToList' and no extension method 'ToList' accepting a first argument of type 'System.Collections.Generic.IEnumerable' could be found (are you missing a using directive or an assembly reference?)

Если немедленное окно не поддерживает методы расширения, тогда почему, когда я ввожу свою переменную (типа IEnumerable<QueryFilter>), за которой следует точка, IntelliSense перечисляет все методы расширения?

Нет ничего плохого в том, что я печатаю в окне Command, потому что, если я скопирую и вставляю его в свой файл кода и запускаю, он работает.

С Visual Studio 2012, выполняющим то же самое для одного и того же решения, отлично работает. Если я вернусь к VS2010, проблема не исчезнет.

ответ

1

Это поведение вызвано Code Contracts и не ограничивается только окном Immediate, а также окном условных точек останова.

Update 1 марта 2016: Нашел MSDN Question спрашивая, почему разрешение типа не работает в моих окошках.Описанное поведение точно такое же, как и при использовании окна Immediate. Причина также приписывается CodeContracts, и отчет об ошибке был отправлен в Microsoft Connect. Независимо от того, разрешена ошибка, не указывается.

+2

Можете ли вы дать некоторое объяснение, почему и как Кодовые контракты вызывают эту проблему? – gabe

+0

Никаких объяснений. Протестировал его, установив еще одну машину, проверил, что она работает правильно, а затем установила кодовые контракты, в результате чего возникла проблема. –

+0

Это не просто моя настройка, то же самое происходит и с моим коллегой. Выполнение точно такого же решения в Visual Studio 2012 и выдача команд в окне Immediate отлично работают. Вернитесь к VS2010, и проблема не исчезнет. –

4

Методы расширения - это только статические методы.

Вы должны иметь возможность использовать, например, System.Linq.Enumerable.ToList()

+0

Проголосовало за то, что оно не отвечает на вопрос о том, почему методы расширения нельзя вызывать, используя обычную свободную нотацию из непосредственного окна. – bradgonesurfing

1

Метод расширения переводится как "Enumerable.ToList" Компилятор обычно конвертировать

myList.Tolist(); 

To:

Enumerable.ToList(myList); 

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

5

Это потому, что пространство имен System.Linq не импортируется в текущем контексте, который вы используете при отладке.

Добавить

using System.Linq; 

в вашем коде.

Пример с Visual Studio 2010:

enter image description here

Первый раз с System.LINQ импортируемого, то без using System.LINQ.

EDIT: Если пространство имен импортируются и IntelliSense отображают методы, то это может быть ошибкой в ​​открывшемся окне. См. this bug entry on connect.

+0

System.Linq импортируется. –

+0

@ Афелия, вы ошибаетесь, Немедленное окно ** определенно поддерживает методы расширения ** (только что протестировал VS2010). По крайней мере, протестируйте его до голосования вниз -__- – ken2k

+0

@ ken2k. Вы правы. Виноват. Я удалил downvote;) – Aphelion

6

Методы расширения - это синтаксический сахар. На самом деле они реализованы static с ключевым словом this. Вы можете вызвать любой метод расширения, используя статический метод, который предоставляет метод расширения. Затем вы должны передать объект, который расширяется в качестве первого параметра.

+0

Почему IntelliSense перечисляет методы расширения, если я не могу назвать их с помощью этого синтаксиса? Это ошибка в Visual Studio? –

+0

Проголосовал, потому что он не отвечает на вопрос, почему методы расширения нельзя вызывать, используя нормальную свободную нотацию из непосредственного окна. – bradgonesurfing

+0

@bradgonesurfing спасибо за объяснение. Однако основной вопрос - это «может», а не «почему». Ответ - нет, и я также предлагаю обходное решение. К сожалению, я не могу ответить на вторичный вопрос. – Aphelion

Смежные вопросы