Это вопрос о видимости метода расширения в .Net (в частности, C #) и о том, почему intellisense может работать, но компилятору не удается выполнить тот же фрагмент кода.
Изобразите это ...
У меня есть библиотека классов .Net 3.5, состоящая из нескольких объектов и одного класса Extension Methods.Вот один из методов:
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
, что SEEMS работает нормально, и при вводе строки Intellisense действительно видит метод расширения, свисающий с экземпляра строки:
http://www.flipscript.com/test/ToTitleCase.jpg
Мне нравится, когда план объединяется!
Однако это конец радости.
При попытке создать веб-сайт сборка завершается неудачно со следующимсообщение:
http://www.flipscript.com/test/titlecaseerror.jpg
При попытке напрямую скопировать класс ExtensionMethods в веб-проект сборка снова завершается неудачно.На этот раз, потому что слово «this» не ожидалось.
Как ни странно, метод расширения работает как обычный статический метод:
http://www.flipscript.com/test/titlecaseok.jpg
...и сборка работает просто отлично (так что проблема на самом деле не с ключевым словом "this").Фактически, сборка работает независимо от того, находится ли класс ExtensionMethods в библиотеке классов или на веб-сайте.
Другими словами, это решит проблему, и сборка будет выполнена успешно.
...но решение отстой.
Вопрос: есть какой-то секретный прием, чтобы заставить методы расширения работать правильно в этом сценарии?
http://www.flipscript.com/test/ToTitleCase.jpg
У меня естьпопробовал трюк "namespace System.Runtime.CompilerServices", но это, похоже, не помогло.
Что могло бы заставить Intellisense правильно видеть метод расширения и сбой компилятора?
Примечание: придуманная переменная примера должна была называться name, а не FirstName, но вы поняли идею.