2017-02-17 40 views
-4
public class Program 
{ 
    public readonly string val; // THIS IS AN ERROR? 
    static void Main(string[] args) 
    { 
     // get parameter value 
     if (args.Length>0) 
     { 
      val = args[0]; 

你能告訴我們爲什麼我編譯時會出錯嗎?在const或readonly變量中放置參數值的最佳方法是什麼?無法在主類中聲明只讀屬性?

回答

4

有兩點需要注意這裏:

  • readonly字段賦值只能出現作爲聲明 的一部分,或在同一類的構造函數。

  • 您的字段是非靜態的,而您的主要功能是靜態的。您不能在靜態上下文中設置非靜態變量。非靜態字段需要類的一個實例。

我建議你標記你的領域爲靜態和值分配給您的變量,你正在聲明

下面的代碼應該運行

public class Program 
{ 
    public static string val; // THIS IS AN ERROR? 
    static void Main(string[] args) 
    { 
     // get parameter value 
     if (args.Length>0) 
     { 
      Program.val = args[0]; 
+0

它與'Main'函數是靜態的有什麼關係? 'Program'不是一個靜態類。 – wkl

+1

在控制檯應用程序中,主要功能是程序的入口點,並由環境調用。可以在不實例化類的對象/實例的情況下調用靜態函數。 請參閱語言規範中的第10章:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf –

+0

這很有道理。 – wkl

1

它與它所在的類無關。只需在聲明或構造函數中用值初始化它即可。 (因爲它是隻讀的,以後不能分配它。)

public readonly string val = "myString"; 
+0

這其實是不正確的,因爲你可以像構造函數中的實例值一樣分配'readonly'。 – Andrew

+0

@Andrew確實必須初始化它。但我沒有說在構造函數中這也是可能的。相反,我選擇了OP代碼中最簡單的解決方案。但我現在已經編輯了我的答案來說明問題。 – wkl

+0

總是最好給出真正的答案,而不僅僅是一半。 – Andrew

0

您必須立即指定它的值。否則,它怎麼可能是「只讀?」

0

readonly必須分配給聲明或該類的構造函數內。這就是它只讀的原因。

也許你最好的選擇是這個

public string val {get; private set;} 

這樣,它只能從程序類內。