Powiedzmy, że potrzebuję prostej, prywatnej metody pomocniczej, a intuicyjnie w kodzie miałaby sens jako metoda rozszerzenia. Czy istnieje sposób na hermetyzację tego pomocnika dla jedynej klasy, która faktycznie potrzebuje go używać?Czy można stosować prywatne metody przedłużania?
Na przykład, spróbuj tego:
class Program
{
static void Main(string[] args)
{
var value = 0;
value = value.GetNext(); // Compiler error
}
static int GetNext(this int i)
{
return i + 1;
}
}
kompilator nie "widzi" metodę GetNext()
przedłużacza. Błąd jest:
metoda Rozszerzenie musi być zdefiniowana w non-rodzajowego klasy statycznej
Słusznie, więc zawinąć go w swojej własnej klasy, ale nadal zamknięte wewnątrz obiektu, gdzie należy:
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;
}
}
}
Jeszcze żadnych kości. Teraz komunikat o błędzie:
Metoda rozszerzenia musi być zdefiniowana w klasie statycznej najwyższego poziomu; Rozszerzenia to klasa zagnieżdżona.
Czy istnieje wymowny powód takiego wymogu? Zdarzają się przypadki, w których metoda pomocnicza powinna być zamknięta w sposób prywatny, a są przypadki, w których kod jest dużo czystszy i bardziej czytelny/obsługiwany, jeśli metoda pomocnicza jest metodą rozszerzenia. W przypadkach, gdy te dwa przecinają się, czy oba mogą być spełnione, czy musimy wybrać jeden nad drugim?
Przeczytaj co Message Pierwszy błąd został mówiąc jej chce cię Klasa Program statyczny, Próbowałeś zarówno statyczne i próby Twojego kodu? – Bearcat9425
Powiązane pytanie: http://stackoverflow.com/questions/2145576/how-can-i-implement-anextext-property-class-for-primitive-types-in-a-clean-w – cvraman
@ Bearcat9425, że * naprawiłoby "ten konkretny scenariusz użycia, ale nie jest ogólnie stosowane.Myślę, że to pytanie dotyczy ogólnej aplikacji, a nie przykładowych aplikacji konsolowych: –