Mise à JOUR: Cette question a été l'objet de mon blog en décembre 2013. Merci pour la grande question!
Vous pouvez le faire, dans un sens. Mais je devrais commencer par parler brièvement le principe de conception de base de résolution de surcharge en C#. Toutes les résolution de surcharge est, bien sûr, sur la prise d'un ensemble de méthodes avec le même nom et en choisissant de définir l'unique meilleur membre de l'appeler.
Il y a beaucoup de facteurs impliqués dans la détermination de qui est la "meilleure" méthode; langues différentes d'utiliser un autre "mélange" des facteurs de comprendre cela. C# en particulier fortement poids "proximité" d'une méthode donnée pour le site d'appel. Si le choix entre une méthode dans une classe de base ou d'une nouvelle méthode applicable dans une classe dérivée, C# prend une dans la classe dérivée, car elle est la plus proche, même si l'un dans la classe de base est de toute autre manière une meilleure correspondance.
Et donc, nous courons vers le bas de la liste. Les classes dérivées sont plus proches que les classes de base. Les classes internes sont plus près que l'extérieur des classes. Méthodes dans la hiérarchie de classe sont plus proches que les méthodes d'extension.
Et nous en arrivons maintenant à votre question. La proximité d'une extension de la méthode dépend (1) de combien d'espaces de noms "out" n'avons-nous aller? et (2) ne nous trouvons la méthode d'extension via using
ou était-il là, dans l'espace de noms? Par conséquent, vous pouvez influer sur la résolution de surcharge en modifiant en ce que l'espace de noms de votre statique de la classe d'extension apparaît, pour le mettre dans un plus proche de l'espace de noms pour le site d'appel. Ou, vous pouvez modifier votre using
des déclarations, de mettre la using
de l'espace de noms qui contient le désiré statique de la classe de plus près que les autres.
Par exemple, si vous avez
namespace FrobCo.Blorble
{
using BazCo.TheirExtensionNamespace;
using FrobCo.MyExtensionNamespace;
... some extension method call
}
ensuite, il est ambigu qui est plus proche. Si vous voulez donner la priorité à la vôtre sur les leurs, vous pouvez choisir de faire ceci:
namespace FrobCo
{
using BazCo.TheirExtensionNamespace;
namespace Blorble
{
using FrobCo.MyExtensionNamespace;
... some extension method call
}
Et maintenant, lors de la résolution de surcharge va à résoudre l'extension de l'appel de méthode, les classes en Blorple
d'abord, puis classes en FrobCo.MyExtensionNamespace
, puis les classes en FrobCo
, puis classes en BazCo.TheirExtensionNamespace
.
Est-ce clair?