2015-01-29 2 views
-7
namespace ConsoleApplication3 
{ 
    public class EncapulationTest 
    { 
     public static void publicMethod() 
     { 
      Console.WriteLine("This is the public method from the EncapsulationTest class!"); 
     } 

     private static void privateMethod() 
     { 
      Console.WriteLine("This is the private method from the EncapsulationTest class!"); 
     } 

    } 
    public class Main 
    { 
     public static void Main() 
     { 
      publicMethod(); 
      Console.ReadLine(); 
     } 
    } 

В качестве опции я не вижу или не вызываю метод publicMethod(), и он говорит, что он не существует в текущем контексте.Нельзя вызвать публичный метод C#

Любая причина для этого, работая с ограниченным примером теории.

Error 1 'Main': member names cannot be the same as their enclosing type

Бросил код в новый проект и БАМ! Спасибо, парни!

+4

'EncapulationTest.publicMethod()' –

ответ

0

publicMethod является статическим членом класса EncapulationTest (sic). Как вы думаете, из вашего кода внутри класса Program компилятор должен знать, где publicMethod есть? Должен ли он искать каждый класс, он может видеть publicMethod? Что он делает, если находит больше одного?

Вы должны сказать ему, какой класс метод принадлежит:

EncapulationTest.publicMethod(); 

Теперь он знает, вы просите для publicMethod, который является статическим членом класса EncapulationTest.

Обратите внимание, что в классе EncapulationTest вам не нужно будет добавлять тип, потому что компилятор всегда будет смотреть в текущей области. Также обратите внимание, что если это был экземпляр, а не статический метод, вам не нужен тип, а объект типа, который имеет этот метод.

+1

Также, чтобы отметить, что экземпляр/static - это то, что методы экземпляра могут обладать видимостью для другого экземпляра методы и статические методы в том же классе, но статические методы не могут ссылаться на методы экземпляра таким образом, потому что им не хватает экземпляра. – David

0

Попробуйте это:

public static void Main() 
{ 
    EncapulationTest.publicMethod(); 
} 
+1

OP может узнать намного больше из объяснения. –

+0

Полностью согласен. Кроме того, если OP скомпилировал его код, прочитайте сообщение об ошибке компилятора, и если этого недостаточно, чтобы понять, тогда прочитайте полное объяснение, нам даже не нужно было бы поднимать этот вопрос. –

1

Проблема в том, что вы назвали publicMethod непосредственно. Подобно пространствам имен классы имеют разные области имен друг от друга, поэтому, хотя метод в пределах тот же класс может упоминаться только по имени, метод в другой класс должен иметь явно определенный класс. Рассмотрим, например, если у нескольких классов в проекте был метод publicMethod - таким образом, вызов должен быть явным.

Обратите внимание, что в то время как C# 5.0 просто требует явного имени класса, в C# 6.0 теперь имеется возможность указывать классы с операторами using, чтобы дать возможность определять методы из других классов таким образом. См. here

В примечании об ошибке, указывающей names cannot be the same as the enclosing type, Это связано с присвоением имени как классу, так и методу Main. это исключение, потому что синтаксис для этого путается близко к constructors и, следовательно, не допускается. Вот почему большинство шаблонов поместите метод Main в класс Program, а не класс Main.

+0

Не знал, что около 6.0. Благодарю. –

+0

@Matt обратите внимание, что .NET 4.6 и vs 2015 не доступны для бета-версии, если у вас есть дополнительная машина для игры с этим - всегда лучший способ быть в курсе новейшей funcaionality. – David

Смежные вопросы