2012-10-21 41 views
3

當有很多問題是相關的,但我無法找到/理解我正在尋找的答案時,對於。C#:非靜態字段,方法或屬性需要對象引用

// 2.開發一個程序將貨幣X轉換爲貨幣Y,反之亦然。

using System; 

class Problem2 
{ 
    static void Main (string[] args) 
    { 
     while (true) { 
      Console.WriteLine ("1. Currency Conversion from CAD to Won"); 
      Console.WriteLine ("2. Currency Conversion from Won to Cad"); 
      Console.Write ("Choose from the Following: (1 or 2)? "); 
      int option = int.Parse(Console.ReadLine()); 
      //double x; 
      if (option == 1) { 
       Console.WriteLine ("Type in the amount you would like to Convert CAD to Won: "); 
       //double y =double.Parse(Console.ReadLine()); 
       //Console.WriteLine(cadToWon(y)); 
       Console.WriteLine(cadToWon(double.Parse(Console.ReadLine()))); 
      } 
      if (option == 2) { 
       Console.WriteLine ("Type in the amount you would like to Convert Won to CAD: "); 
       Console.WriteLine(wonToCad (double.Parse(Console.ReadLine()))); 
      } 
     } 
    } 

    double cadToWon(double x) 
    { 
     return x * 1113.26; 
    } 

    double wonToCad(double x) 
    { 
     return x/1113.26; 
    } 
} 

這給我的錯誤messgae「的對象引用需要非靜態字段,方法或屬性「Problem2 ......」我知道,我就可以,如果要運行的程序我添加方法的靜態infront,但我想知道爲什麼我需要它(我認爲這是因爲Main是靜態的?),我需要改變什麼才能使用這些方法而不添加靜態?

謝謝

+0

還挺有趣,每個人都沒有回答這個問題,並直接去了「讓他們靜」,而問題是爲什麼以及如何做到沒有靜電? – LightStriker

+0

是啊大聲笑,但人們聽到你,幷包括一個解釋。謝謝! –

回答

4

由於您的主要方法是靜態的,cadToWon和wonToCad 必須是靜態的,如果你想從主打電話給他們。

static double cadToWon(double x) //... 


static double wonToCad(double x) //... 

另一種選擇是打破所有的主,cadToWon和wonToCad方法的邏輯出成新類,然後讓你的主要方法簡單地設置和運行新的類。但我懷疑這可能超出了你的任務範圍。


要回答你的問題爲什麼添加靜態使這項工作:

static方法跨類的所有實例共享。因此,無論您參加什麼類別的Problem2實例,只有一個Main方法可以在所有這些方法之間共享。

cadToWon然而,是實例方法。它屬於類Problem2特定實例。

其結果是,你不能從MaincadToWon,因爲Main不知道什麼實例Problem2調用cadToWon上。 Main不知道什麼實例調用cadToWon因爲Main不是belong到任何實例。

+0

他們不必是靜態的,他們不必在另一個班級。我承認這是一個更好的設計,但它不是一個限制。 – LightStriker

+0

@Marc - 當然你是對的。他可以創建類Problems3的新實例,並在Main中調用該實例的cadToWon。我只是想保持OP的簡單。 –

+0

他知道,使他們靜態工作......他的問題是爲什麼以及如何使它無靜態工作?有趣的是,每個人都回答「讓它們靜止」到這個問題。 – LightStriker

0

這是因爲Main是靜態的,沒有分配給Problem2的任何實例。不知道Problem2的哪個實例發送變量,它無法調用正確的方法。

現在,您的方法不會修改任何Problem2的任何字段。但他們可以,而這就是整個問題。應該修改哪個Problem2實例?靜態方法無法知道這一點。

所以,如果你初始化了Problem2的一個實例,你可以從靜態Main中調用它自己的方法版本。

Problem2 problem = new Problem2(); 

problem.cadToWon(...) 
0

使你的方法static將解決這個問題。您不能從靜態方法(例如static void main(..))調用實例成員(不包括static)。它們要麼必須聲明爲static,要麼創建方法所在類的實例,並通過實例訪問它們。我不認爲你需要訪問這裏

static double cadToWon(double x) 
{ 
    return x * 1113.26; 
} 

static double wonToCad(double x) 
{ 
    return x/1113.26; 
} 

通過實例

Program2 p2 = new Program2(); 
double x = p2.wonToCad(10); 
+0

「我知道我可以運行程序,如果我添加方法的靜態盈方,但我想知道爲什麼我需要它」 – LightStriker

+0

您需要它,因爲'main'是靜態的。我的答案包括如何不**添加'static'並仍然調用方法 - 創建'Program2'的實例 – codingbiz

-1

如果您不想將其更改爲靜態的,則只需將它們移動到另一個類,然後在main創建一個對象並使用這些功能。

0

這個解決方案正是這裏尋求的解決方案。 試圖從靜態主要對象傳遞到在類中的方法:程序是沒有幾乎不可能:

`Program ProgramInstance = new Program(); 
ProgramInstance.ProcessObject(MyObject);` 
相關問題