Могут ли быть частные методы расширения?
Позволять'скажем, у меня есть потребность в простом частном вспомогательном методе, и интуитивно в коде это будет иметь смысл как метод расширения. Есть ли способ инкапсулировать этот помощник в единственный класс, который действительно нуждается в его использовании?
Например, я пытаюсь это:
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;
}
}
}
Все еще нет игры в кости. Теперь ошибка гласит:
Метод расширения должен быть определен в статическом классе верхнего уровня; Расширения - это вложенный класс.
Есть ли веская причина для этого требования? Существуют случаи, когда вспомогательный метод действительно должен быть инкапсулирован в частном порядке, и есть случаи, когда код намного чище и более читабелен / поддерживается, если вспомогательный метод является методом расширения. Для случаев, когда эти два пересекаются, могут ли оба быть удовлетворены, или мы должны выбрать один над другим?