VisualStudio Intellisense и Lambdas. Как я могу сделать так, чтобы он не выбирал реальный тип? - PullRequest
3 голосов
/ 23 июля 2011

Я работаю над служебным классом, и один из моих методов определен:

void SomeMethod(Action<T> a);

Неловко то, что в Visual Studio 2010, когда вы начинаете печатать:

someClass.SomeMethod(x ...

когда вы нажимаете клавишу [x], а затем [пробел], intellisense автоматически выбирает, какой первый класс был начат с «X», обычно какой-то класс «XmlWhothing»

Однако, если я изменю подпись моего метода на:

void SomeMethod(Expression<Action<T>> a);

Тогда, если я начну печатать то же самое использование, нажатие [x] [пробел] ставит фактическую букву 'x'. Кажется, что целочисленные маркеры, помещающие в лямбду, были ожидаемым параметром типа Expression<>, но не типа Action<>.

Есть ли способ заставить VS intellisense правильно обрабатывать первый случай? Я не могу передать Expression, потому что я планирую использовать:

someClass.SomeMethod(x => x.Property1 = 123);

, что приводит к ошибке CS0832: дерево выражений может не содержать оператор присваивания Следовательно, я хочу, чтобы Action<> был передан, мне действительно не нужно выражение, оно просто исправляет intellisense.

Это действительно раздражает, потому что когда я печатаю в параметрах Action, мне приходится нажимать [x] [esc] [пробел] [=] [>], чтобы получить текст «x =>» , добавив клавишу «escape», чтобы закрыть всплывающее окно intellisense. Есть мысли или идеи?


Edit:

Хорошо, я действительно должен немного перефразировать свой вопрос. Мой пример кода выше был не совсем точным. Похоже, что это так с VS intellisense:

Это обрабатывается правильно:

public static T SomeMethod<T>(Action<T> actions) where T : class

, но это НЕ обрабатывается intellisense:

public static T IsT4<T>(params Action<T>[] actions) where T : class

Похоже, что intellisense не нравится params.

Ответы [ 2 ]

0 голосов
/ 05 марта 2013

Вы можете использовать явный синтаксис создания массива, чтобы обойти эту проблему:

obj.IsT4(new Action<SomeType>[] { x => ...

Вы также можете создать дополнительную перегрузку метода IsT4, которая принимает ровно 1 делегат действия.

0 голосов
/ 05 марта 2013

Инструменты |Варианты |C # |Intellisense

Снимите флажок «Подтверждено нажатием пробела».

enter image description here

...