2010-03-24 73 views
24

Tôi đang tạo một ứng dụng trong C#. Chức năng của nó là để đánh giá nếu một số nguyên tố cho trước và nếu cùng một số hoán đổi là số nguyên tố.Lỗi: "một tham chiếu đối tượng là bắt buộc đối với trường, phương thức hoặc thuộc tính không tĩnh ..."

Khi tôi xây dựng giải pháp của mình trong Visual Studio, nó nói rằng "một tham chiếu đối tượng là bắt buộc đối với trường, phương thức hoặc thuộc tính không tĩnh ...". Tôi đang gặp vấn đề này với các phương pháp "volteado" và "siprimo".

Sự cố xảy ra ở đâu và làm cách nào để khắc phục sự cố?

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.Write("Write a number: "); 
      long a= Convert.ToInt64(Console.ReadLine()); // a is the number given by the user 


      long av = volteado(a); // av is "a" but swapped 

      if (siprimo(a) == false && siprimo(av) == false) 
       Console.WriteLine("Both original and swapped numbers are prime."); 
      else 
       Console.WriteLine("One of the numbers isnt prime."); 
      Console.ReadLine(); 
     } 

     private bool siprimo(long a) 
     { 
      // Evaluate if the received number is prime 
      bool sp = true; 
      for (long k = 2; k <= a/2; k++) 
       if (a % k == 0) sp = false; 
      return sp; 
     } 

     private long volteado(long a) 
     { 
      // Swap the received number 
      long v = 0; 
      while (a > 0) 
      { 
       v = 10 * v + a % 10; 
       a /= 10; 
      } 
      return v; 
     } 
    } 
} 
+2

Chào mừng bạn đến với StackOverflow! Vui lòng sử dụng nhiều tên câu hỏi mô tả hơn trong tương lai :) – Matchu

+0

Vui lòng chỉnh sửa câu hỏi của bạn để định dạng. Một vài dòng mã đầu tiên của bạn không được định dạng mã. –

+3

Thực hiện các định dạng có liên quan, chỉnh sửa tiêu đề :) – Matchu

Trả lời

51

Bạn không thể truy cập thành viên không tĩnh từ phương pháp tĩnh. (Lưu ý rằng Main() là tĩnh, đó là yêu cầu của .Net). Chỉ cần làm cho siprimo và volteado tĩnh, bằng cách đặt từ khóa tĩnh trước mặt chúng. ví dụ:

static private long volteado(long a) 
+0

khắc phục sự cố! cảm ơn bạn :) – user300484

+0

@ user300484 bạn nên đánh dấu câu trả lời này là chính xác bằng cách nhấp vào dấu kiểm bên dưới xếp hạng. – mxmissile

+3

Câu trả lời thực sự cho câu hỏi này được cung cấp bởi shazia, đây là giải pháp không có ý nghĩa lập trình –

3

Thay đổi chữ ký của bạn thành siprimo tĩnh riêng tư (dài a) và tĩnh điện dài tĩnh tư nhân (dài a) và xem nơi bạn nhận được.

18

Chỉ cần thêm static vào khai báo hai phương pháp này và lỗi thời gian biên dịch sẽ biến mất!

Theo mặc định trong phương pháp C# là phương pháp thể hiện và họ nhận được đối số "tự" tiềm ẩn. Bằng cách làm cho chúng tĩnh, không có đối số như vậy là cần thiết (và cũng không có sẵn), và phương thức này dĩ nhiên phải tránh truy cập vào bất kỳ đối tượng nào (không tĩnh) hoặc các phương thức của lớp đó.

Thông tin thêm về phương pháp tĩnh
Cung cấp các lớp và bổ truy cập của phương pháp (công cộng so với tư nhân) là ok, một phương pháp tĩnh sau đó có thể được gọi từ bất cứ nơi nào mà không cần phải trước đây khởi tạo một thể hiện của lớp. Nói cách khác phương pháp tĩnh được sử dụng với cú pháp như sau:

className.classMethod(arguments) 
rather than 
    someInstanceVariable.classMethod(arguments) 

Một ví dụ cổ điển của phương pháp tĩnh được tìm thấy trong lớp System.Math, nhờ đó mà chúng ta có thể gọi một loạt các phương pháp như

Math.Sqrt(2) 
    Math.Cos(Math.PI) 

mà không bao giờ instantiating một lớp "Toán" (trong thực tế, tôi thậm chí không biết nếu một ví dụ như vậy là có thể)

+3

+1 để cung cấp thông tin chi tiết về vấn đề thay vì chỉ sửa nhanh: điều này hữu ích hơn cho người mới đến C# học những điều cơ bản. Tôi có hai ý kiến ​​bên, tuy nhiên: 1) Toán học là một lớp tĩnh (http://msdn.microsoft.com/en-us/library/system.math.aspx) để nghi ngờ của bạn là đúng: nó không thể được instantiated ; và 2) có lẽ bạn nên cung cấp một số ví dụ về các phương pháp ví dụ ... ToString phổ biến() đến với tâm trí. –

0

Bạn chỉ cần làm cho các phương pháp siprimo và volteado tĩnh.

private static bool siprimo(long a) 

private static long volteado(long a) 
0

Các thông báo lỗi có nghĩa là bạn cần phải gọi volteadosiprimo trên một thể hiện của lớp Program. Ví dụ .:

... 
Program p = new Program(); 
long av = p.volteado(a); // av is "a" but swapped 

if (p.siprimo(a) == false && p.siprimo(av) == false) 
... 

Họ không thể được gọi trực tiếp từ phương pháp MainMain là tĩnh trong khi volteadosiprimo thì không.

Cách dễ nhất để sửa lỗi này là làm cho volteadosiprimo phương pháp tĩnh:

private static bool siprimo(long a) 
{ 
    ... 
} 

private static bool volteado(long a) 
{ 
    ... 
} 
32

Tạo một lớp và đặt tất cả mã của bạn trong đó và gọi một thể hiện của lớp này từ chính:

static void Main(string[] args) 
{ 

    MyClass cls = new MyClass(); 
    Console.Write("Write a number: "); 
    long a= Convert.ToInt64(Console.ReadLine()); // a is the number given by the user 
    long av = cls.volteado(a); 
    bool isTrue = cls.siprimo(a); 
    ......etc 

} 
+5

Đây là giải pháp thực sự cho vấn đề này –

+0

Có, về lâu dài và thực hành tốt, bạn nên đóng gói nó trên một lớp học. – Patricio

Các vấn đề liên quan