Método de extensão .Net (esta string Foo) apenas parcialmente visível

Esta é uma pergunta sobre a visibilidade do método de extensão no .Net (especificamente C #) e por que o intellisense pode funcionar, mas o compilador falha no mesmo trecho de código.

Imagine isso...

Eu tenho .Net 3.5 biblioteca de classes que consiste em um monte de objetos e uma única classe de métodos de extensão. Aqui está um dos métodos:

namespace MyApp.Extensions
{
    public static class ExtensionMethods
    {
        public static string ToTitleCase(this string Origcase)
        {   string TitleCase = Origcase;
            ... implementation ...
            return TitleCase;
        }
    }

Para usar os métodos de extensão na própria biblioteca de classes, cada classe que requer um dos métodos precisa especificar:

using MyApp.Extensions;

Como esse é um espaço para nome diferente do restante da biblioteca. Tudo isso funciona bem.

Agora, um site .Net 2.0 referencia adequadamente essa biblioteca e um arquivo de classe deseja usar a biblioteca. Por isso, declara que é:

using MyApp.Extensions

Isso parece funcionar bem e, ao digitar uma string, o Intellisense vê o método de extensão pendurado em uma instância de string:

http://www.flipscript.com/test/ToTitleCase.jpg

Adoro quando um plano se reúne!

No entanto, esse é o fim da alegria.

Ao tentar compilar o site, a compilação falha com a seguinte mensagem:

http://www.flipscript.com/test/titlecaseerror.jpg

Ao tentar copiar diretamente a classe ExtensionMethods no projeto da Web, a compilação falha novamente. Desta vez, porque a palavra "this" não era esperada.

Curiosamente, o método de extensão funciona como um método estático normal:

http://www.flipscript.com/test/titlecaseok.jpg

... e o Build funciona muito bem (portanto, o problema NÃO é realmente a palavra-chave "this"). De fato, a compilação funciona se a classe ExtensionMethods está na biblioteca de classes ou no site.

Em outras palavras, isso resolve o problema e a compilação será bem-sucedida.

... mas a solução é péssima.

Pergunta: Existe algum tipo de truque secreto para fazer com que os métodos de extensão funcionem corretamente nesse cenário?

http://www.flipscript.com/test/ToTitleCase.jpg

Eu tentei o truque "namespace System.Runtime.CompilerServices", mas isso não pareceu ajudar.

O que faria o Intellisense ver um método de extensão corretamente e o compilador falhar?

Nota: A variável de exemplo artificial deveria ter sido chamada de 'nome' em vez de 'Nome', mas você entendeu.

questionAnswers(3)

yourAnswerToTheQuestion