Я работаю над служебным классом, и один из моих методов определен:
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
.