UPDATE: этот вопрос был предметом моего блога в декабре 2013 года . Спасибо за большой вопрос!
Вы можете сделать это, в некотором смысле. Но я должен начать с краткого обсуждения базового принципа проектирования разрешения перегрузки в C #. Разумеется, все разрешения перегрузки включают набор методов с тем же именем и выбор из этого набора уникального лучшего участника для вызова.
При определении того, что является «лучшим» методом, существует множество факторов; на разных языках используется другая «смесь» факторов, чтобы понять это. C #, в частности, сильно «близость» данного метода к сайту вызова. Если задан выбор между применимым методом в базовом классе или новым применимым методом в производном классе, C # берет один из производного класса, потому что он ближе, даже если тот, который находится в базовом классе, в любом другом случае лучше совпадение.
И поэтому мы пропустим список. Производные классы ближе, чем базовые классы. Внутренние классы ближе, чем внешние классы. Методы в иерархии классов ближе, чем методы расширения.
И теперь мы подошли к вашему вопросу. Близость метода расширения зависит от (1), сколько пробелов в пространстве имен мы должны были уйти? и (2) нашел ли мы метод расширения через using
или был ли он правильным в пространстве имен? Поэтому вы можете повлиять на разрешение перегрузки, изменив в пространстве имен ваш статический класс расширения, чтобы поместить его в более близкое пространство имен на сайт вызова. Или вы можете изменить свои объявления using
, чтобы поместить using
пространства имен, которое содержит желаемый статический класс, ближе другого.
Например, если у вас есть
namespace FrobCo.Blorble
{
using BazCo.TheirExtensionNamespace;
using FrobCo.MyExtensionNamespace;
... some extension method call
}
, тогда это двусмысленно, что ближе. Если вы хотите расставить приоритеты по своему усмотрению, вы можете сделать это:
namespace FrobCo
{
using BazCo.TheirExtensionNamespace;
namespace Blorble
{
using FrobCo.MyExtensionNamespace;
... some extension method call
}
И теперь, когда разрешение перегрузки идет для разрешения вызова метода расширения, классы в Blorple
сначала идут, затем классы в FrobCo.MyExtensionNamespace
, затем в классах FrobCo
, а затем в классах BazCo.TheirExtensionNamespace
.
Ясно, что