Скажем, мне нужен простой частный помощник, и интуитивно в коде он будет иметь смысл в качестве метода расширения. Есть ли способ инкапсулировать этого помощника в единственный класс, который действительно должен его использовать?
Например, я пробую это:
class Program
{
static void Main(string[] args)
{
var value = 0;
value = value.GetNext(); // Compiler error
}
static int GetNext(this int i)
{
return i + 1;
}
}
Компилятор не видит метод расширения GetNext()
. Ошибка:
Метод расширения должен быть определен в неэквивалентном статическом классе
Достаточно честный, поэтому я переношу его в свой собственный класс, но все же инкапсулированный внутри объекта, где он принадлежит:
class Program
{
static void Main(string[] args)
{
var value = 0;
value = value.GetNext(); // Compiler error
}
static class Extensions
{
static int GetNext(this int i)
{
return i + 1;
}
}
}
Все еще нет кубиков. Теперь ошибка:
Метод расширения должен быть определен в статическом классе верхнего уровня; Расширения - это вложенный класс.
Есть ли веская причина для этого требования? Бывают случаи, когда метод-помощник действительно должен быть конфиденциально инкапсулирован, и бывают случаи, когда код намного чище и читабельнее/поддерживается, если вспомогательный метод является методом расширения. Для случаев, когда эти два пересекаются, могут быть выполнены или мы должны выбрать один над другим?