Это вопрос о методе расширения видимость в. Net (в частности, C #), и почему intellisense может работать, но компилятор не работает с тем же фрагментом кода.
Представьте себе это ...
У меня есть библиотека классов .Net 3.5, состоящая из группы объектов и одного Класс методов расширения. Вот один из методов:
namespace MyApp.Extensions
{
public static class ExtensionMethods
{
public static string ToTitleCase(this string Origcase)
{ string TitleCase = Origcase;
... implementation ...
return TitleCase;
}
}
Чтобы использовать методы расширения в самой библиотеке классов, каждый класс, которому требуется один из методов, должен указать:
using MyApp.Extensions;
Поскольку это пространство имен отличается от остальной части библиотеки. Все это работает нормально.
Теперь веб-сайт .Net 2.0 правильно ссылается на эту библиотеку, и файл класса хочет использовать библиотеку. Таким образом, он заявляет, что это:
using MyApp.Extensions
Это КАЖЕТСЯ работать нормально, и при вводе строки Intellisense видит, что метод расширения свисает с экземпляра строки:
http://www.flipscript.com/test/ ToTitleCase.jpg
Мне нравится, когда план слагается!
Однако это конец радости.
При попытке построить веб-сайт сборка завершается ошибкой со следующим сообщением:
http://www.flipscript.com/test/titlecaseerror.jpg
При попытке напрямую скопировать класс ExtensionMethods в веб-проект сборка снова завершается ошибкой. На этот раз, потому что слово «это» не ожидалось.
Как ни странно, метод расширения действительно работает как обычный статический метод:
http://www.flipscript.com/test/titlecaseok.jpg
... и сборка работает нормально (так что проблема НЕ в ключевом слове "this"). Фактически, сборка работает независимо от того, находится ли класс ExtensionMethods в библиотеке классов или на веб-сайте.
Другими словами, это решает проблему, и сборка будет успешной.
... но решение отстой.
Вопрос: Есть ли какой-то секретный трюк, чтобы заставить методы расширения работать правильно в этом сценарии?
http://www.flipscript.com/test/ToTitleCase.jpg
Я пробовал пространство имен System.Runtime. CompilerServices ", но, похоже, это не помогло.
Что могло заставить Intellisense правильно видеть метод расширения и отказывать компилятору?
Примечание: надуманная переменная примера должна была называться" имя "вместо "FirstName", но идею вы поняли.