Il s'agit d'une question sur la visibilité de la méthode d'extension dans .Net (en particulier C#), et pourquoi intellisense peut fonctionner, mais le compilateur échoue sur le même morceau de code.. Méthode d'extension .Net (cette chaîne Foo) Seulement partiellement visible
Imaginez ...
Je .Net 3.5 bibliothèque de classes composée d'un groupe d'objets et une seule classe Méthodes d'extension. Voici l'une des méthodes suivantes:
namespace MyApp.Extensions
{
public static class ExtensionMethods
{
public static string ToTitleCase(this string Origcase)
{ string TitleCase = Origcase;
... implementation ...
return TitleCase;
}
}
Pour utiliser les méthodes d'extension dans la bibliothèque de classe elle-même, chaque classe qui nécessite l'une des méthodes doit préciser:
using MyApp.Extensions;
Depuis est un espace de noms différent que le reste de la bibliothèque. Tout cela fonctionne bien.
Maintenant, un site Web .NET 2.0 référence correctement cette bibliothèque, et un fichier de classe souhaite utiliser la bibliothèque. Ainsi, il déclare qu'il est:
using MyApp.Extensions
qui semble fonctionner très bien, et lorsque vous tapez une chaîne, IntelliSense ne voit la méthode d'extension ballants hors d'une instance de chaîne:
http://www.flipscript.com/test/ToTitleCase.jpg
J'adore quand un plan arrive ensemble!
Cependant, c'est la fin de la joie.
Lorsque vous essayez de construire le site Web, la génération échoue avec le message suivant:
http://www.flipscript.com/test/titlecaseerror.jpg
Lorsque vous essayez de copier directement la classe ExtensionMethods dans le projet Web, la génération échoue à nouveau. Cette fois, parce que le mot "ceci" n'était pas attendu.
Bizarrement, la méthode d'extension ne fonctionne comme une méthode statique normale:
http://www.flipscript.com/test/titlecaseok.jpg
... et la construction fonctionne très bien (si le problème est pas vraiment avec le mot-clé « this ») . En fait, la construction fonctionne que la classe ExtensionMethods se trouve dans la bibliothèque de classes ou sur le site Web. En d'autres termes, cela résout le problème et la génération réussit.
... mais la solution craint. Question: Y a-t-il une sorte d'astuce secrète pour que les méthodes d'extension fonctionnent correctement dans ce scénario?
http://www.flipscript.com/test/ToTitleCase.jpg
J'ai essayé le truc « espace de noms System.Runtime.CompilerServices », mais cela ne semble pas aider.
Qu'est-ce qui provoquerait Intellisense à voir une méthode d'extension correctement et le compilateur à échouer?
Remarque: La variable d'exemple artificielle aurait dû s'appeler 'nom' au lieu de 'Prénom', mais vous en avez l'idée.
Des conneries! Cela semblait faire l'affaire, Marc! – Flipster
Le site Web de tiers que j'utilise REQUIERT qu'il demeure un site .Net 2.0. Est-ce que cela viole cette exigence? (Je vais faire quelques tests pour voir, mais je vais bosse votre réponse déjà car il était juste sur l'argent) – Flipster
Je reviendrai et marquer cette réponse comme acceptée si le site .Net 2.0 ne se plaint pas de cela Attribut "CompilerVersion". – Flipster